C countdown-zeit für eingabe

azdr

Lieutenant
Registriert
Feb. 2005
Beiträge
685
HI allerseids
Wie aus der Überschrift ersichtlich möchte ich in mein Programm eine Countdownzeit einbauen das dem User eine gewisse Zeit gibt um eine Eingabe zu tätigen.

Ich hab das ganze mit der sleep Funktion probiert hat aber nicht so funktioniert wie ich es mir vorgestellt habe.

wie kann ich das dynamisch machen das sobald der Befehl Eingabe (scanf) kommt dass, das Programm schon im Hintergrund die vordefinierte CountdownZeit herunterzählt.
und sofort mit dem nächsten Befehl weitermacht gleichgültig ob was eingetippt wurde oder nicht



Code:
                         ......
                         n++;
                         sleep(5000);
                         scanf("%ld",&index[n].summe);
                         .....

danke schon mal
 
Wahrscheinlich hast du das Problem, dass während sleep(5000) ausgeführt wird, keine Eingabe möglich ist bzw. die komplette Zeit gewartet wird oder?

Könnte man umgehen, indem man eine Schleife drum macht, die 5000 mal ausgeführt wird und innerhalb der Schleife "nur" sleep(1) ausführt.

C ist für mich leider schon zwei Jahre her, sonst könnte ich evtl. weiter helfen.
 
int counter=0;
while(scanf("%ld",&index[n].summe))==EOF && counter<1000)
{
counter++;
sleep(5);
}
 
Entweder du machst es auf die einfache Art, sequentielles Abfragen, wie der Code von -Sisko- zeigt oder du verwendest den professionellen Weg.

Die Antwort auf deine Frage ist Threading. Starte vor der Abfrage einen Thread. In diesem lässt du einen Timer laufen, der nach Ablauf der Zeit die Abfrage beendet. Dazu lässt sich eine simple Variable setzen.

Code:
HANDLE handle = CreateThread(NULL, 0, ::MyCountdown, NULL, 0, &threadId);
 
@Stefan_Sch:
Threading dafür professionell? *kopfkratz* Wie willst du den Main-Thread aus dem scanf aufwecken?

Als allgemeine Antwort: Geht mit ANSI-C nicht. Dazu braucht man plattformspezifische Bibliotheken.

Unter Windows wäre eine saubere Lösung, mit WaitForMultipleEvents entweder auf einen Timer oder auf Input zu warten. Wozu man dort einen Thread braucht, ist mir schleierhaft. Erfordert allerdings schon halbwegs solide Kenntnisse mit der Windows-API. Außerdem muss man dann sämltlichen Input auf Windows-API umstellen, wenn man es wirklich sauber haben will. Denn ansonsten buffert die C-Runtime stellenweise irgendwas, was durch die API-Calls nicht sichtbar ist. Eventuell kann man hier auch eine "Schmuddel"-Lösung über Polling und kbhit() & getchar() was bauen, wenn man die <conio.h> hat. Unter Linux läuft es auf ein select hinaus.

Die Lösung von sisko wird warten, bis Enter gedrückt wird. EOF kommt nämlich dann, wenn der Stream "zu Ende" ist - und das kann bei einer Tastatur schlecht der Fall sein.
 
Zuletzt bearbeitet:
7H3 N4C3R schrieb:
@Stefan_Sch:
Threading dafür professionell? *kopfkratz*

Es gibt zum Threading keine Alternative. Man kann nicht gleichzeitig Eingaben verwerten und einen Timer zählen lassen.

7H3 N4C3R schrieb:
Wie willst du den Main-Thread aus dem scanf aufwecken?

Das war nicht die angesprochene Lösung. Es gibt keine Methode, die dazu führt das der Hauptthread aus der Funktion scanf springt, sobald der Timer ausläuft. Das ist auch nicht notwendig, weil es lediglich darum geht Eingaben nach der Beendigung des Countdowns abzulehnen.
 
Stefan_Sch schrieb:
Man kann nicht gleichzeitig Eingaben verwerten und einen Timer zählen lassen.
WaitForMultipleEvents und ein Single-Shot Timer. Die Einsatzberechtigung eines Threads dafür sehe ich nicht (geschweige denn einen Nutzen).

Stefan_Sch schrieb:
weil es lediglich darum geht Eingaben nach der Beendigung des Countdowns abzulehnen.
So habe ich den OP nicht verstanden - so wie ich das lese, soll sich scanf "von selbst" nach Ablauf der Zeit beenden. Da wird der OP wohl weiter helfen können.
 
7H3 N4C3R schrieb:
WaitForMultipleEvents und ein Single-Shot Timer. Die Einsatzberechtigung eines Threads dafür sehe ich nicht (geschweige denn einen Nutzen).

Jeder Single-Shot Timer läuft in seinem eigenen Thread.

7H3 N4C3R schrieb:
So habe ich den OP nicht verstanden - so wie ich das lese, soll sich scanf "von selbst" nach Ablauf der Zeit beenden.

Sofern er das tatsächlich will, wird es so natürlich nicht funktionieren. Ich bin davon ausgegangen das er in der Konsole ein Eingabeformular kreieren möchte, in dem gleichzeitig eine ablaufende Uhrzeit angezeigt wird.
 
Stefan_Sch schrieb:
Jeder Single-Shot Timer läuft in seinem eigenen Thread.
Das kann Windows-seitig so sein, interessiert mich als Entwickler aber nicht. SetTimer und ein Callback, welches asynchron gerufen wird und ein Event auf Signaled setzt - fertig ist die Laube.
 
7H3 N4C3R schrieb:
Das kann Windows-seitig so sein, interessiert mich als Entwickler aber nicht. SetTimer und ein Callback, welches asynchron gerufen wird und ein Event auf Signaled setzt - fertig ist die Laube.

Das ist natürlich richtig. Ob ich das nun manuell mache oder direkt die API calle, ist nun eine Frage der Präferenzen.

Wie auch immer, der Threadersteller wird dafür Funktionen des Betriebssystems aufrufen müssen und damit ist ANSI-C sowieso Geschichte.
 
Danke erstmal für eure antworten,
@sisko deinen Codeausschnitt habe ich in mein programm eingebaut aber leider tut sich da nichts.
auch wenn die Zeit verstrichen ist wird nicht automatisch der nächste Befehl abgearbeitet.


soweit ich das hier mitverfolgen konnte ist es schon ziemlich knifflig gleichzeitig die Eingabe zu verwerten und im Hintergrund die Zeit herunterzählen zulassen.
Naja Blöd ist jetzt in meinem Fall das C die Befehle hintereinander abarbeitet und nicht auf wunsch parallel.
 
Zuletzt bearbeitet:
@azdr:
Falls du unter Windows bist, probier mal aus, ob dir das include <conio.h> zur Verfügung steht. Ist zwar unportabel, aber damit hättest du die Funktionen kbhit() (gibt zurück ob eine Taste gedrückt wurde) und getch() (liest ein Zeichen und gibt es zurück) zur Verfügung. Das wäre zumindest mit wenig Aufwand eine Lösung, die funktioniert.
 
azdr schrieb:
...soweit ich das hier mitverfolgen konnte ist es schon ziemlich knifflig ...
ja, das ist es wirklich - Ich hab mich mal daran versucht, allerdings in c++/WinApi. Dazu habe ich eine Funktion geschrieben bei der man die Zeit(Time-out) angeben kann , als auch die Anzahl der maximal ein zu lesenden Zeichen - zurückgegeben wird die Anzahl der Zeichen die in den Puffer geschrieben wurden. Da man die gesamte Tastatureingabe selbst verarbeiten muss, hab ich (neben allen alphanumerischen- und Sonderzeichen) nur die Eingabe-, Rück-, Entf-, Esc- und die Pfeiltasten implementiert ... mehr brauch man ja auch nicht. Im Anhang den Quellcode und ein kleines Demonstrationsprog..
 

Anhänge

Zuletzt bearbeitet:
@Woey danke für das Programm hat mir schon viel weitergeholfen!!
 
Zurück
Oben