Timeout, Countdown und der Tastaturpuffer
-
Folgendes Problem:
Bei einer Windows(NT)-Konsolen-Anwendung soll für eine bestimmte Zeit ein Disclaimer gezeigt werden. Nach Ablauf dieser Idle-Time erscheint die Meldung "Bitte Taste drücken..." und das Programm wird fortgesetzt.
Ich habe verschiedene Sachen probiert, z.B. Schleifen oder die sleep()-Funktion. Aber ich kenne meine User, die keinen Meter warten und während der Wartezeit wie wild auf der Tastatur herumkloppen. Das bedeutet, dass der Tastaturpuffer voll mit Blödsinn ist und vor allem der Tastendruck damit quasi schon erledigt wurde. D.h. Das Programm wird nach der Wartezeit unmittelbar fortgesetzt und die folgende fgets()-Anweisung wird mit Schrott gefüllt.
Also:
- gibt es eine gescheite Methode, den Rechner für eine bestimmte Dauer ins Wartezimmer zu setzen - vielleicht sogar einen Countdown? (Fortschrittsbalken könnte ich ja - mit Holzhammer-Technik )
- kann ich während dieser Zeit stdin blockieren/ignorieren oder den Puffer anschließend vollständig leeren? (fflush(stdin) reicht offensichtlich nicht)
Ich arbeite unter Windows NT 4.0 mit dem Bloodshed Dev-Cpp-Compiler - also nix kbhit() etc.
Programm soll später ggf. unter XP laufen
Danke!
-
Mach doch nach der "Idle-Time und der Meldung "Bitte Taste drücken...""
fflush( stdin );
und danach ein getch();Flushes a stream.
int fflush( FILE *stream );
fflush returns 0 if the buffer was successfully flushed. The value 0 is also returned in cases in which the specified stream has no buffer or is open for reading only. A return value of EOF indicates an error.Note If fflush returns EOF, data may have been lost due to a write failure. When setting up a critical error handler, it is safest to turn buffering off with the setvbuf function or to use low-level I/O routines such as _open, _close, and _write instead of the stream I/O functions.
Parameter
stream
Pointer to FILE structure
Remarks
The fflush function flushes a stream. If the file associated with stream is open for output, fflush writes to that file the contents of the buffer associated with the stream. If the stream is open for input, fflush clears the contents of the buffer. fflush negates the effect of any prior call to ungetc against stream. Also, fflush(NULL) flushes all streams opened for output. The stream remains open after the call. fflush has no effect on an unbuffered stream.
-
...geht nicht. Er löscht das erste Zeichen noch aus dem Puffer, aber den Rest schreibt er gnadenlos in die nächste Zeile.
fflush(stdin);
scheint nur immer ein Zeichen zu löschen. Eine Schleife à la
while(!(fflush(stdin)==EOF));
scheint es auch nicht zu tun.