Spezielle Funktion zum Schlafen oder Auslesen des Eingabepuffers gesucht.



  • Hallo, liebe Leute.

    Ich lerne seit etwas mehr als einem halben Jahr C++ und zu programmieren überhaupt, sodaß ich mit der häufig benötigten Syntax vertraut bin, aber nur sehr schwammige Vorstellungen von den dahinterstehenden Prozessen habe. - Nur, damit helfende Seelen wissen, woran sie sind.

    Nun schreibe ich an einem Windows-Konsolenprogramm, das ich bis Sonntag fertigstellen will, da es ein Geburtstagsgeschenk sein soll. (Ich weiß, andere Leute schenken Blumen oder Schokolade . . .) Ich bitte euch also um rasche Hilfe!

    Mein Problem ist folgendes: An einer Stelle des Programms soll dieses für eine bestimmte Zeitspanne unterbrochen werden (die Unterbrechungszeit wird in Millisekunden übergeben, es wäre also schön, wenn ich z. B. Sleep() aus <windows.h> verwenden könnte) und danach mit der Ausgabe fortfahren, a u ß e r , der Benutzer hat in dieser Zeit eine Tastatureingabe begonnen: dann soll das Programm warten, bis diese mit der Eingabetaste abgeschlossen wird.

    Ich habe den Gedanken, ich müsste eine Funktion haben, die den Inhalt des Eingabepuffers überprüft - tief vergraben unter zahllosen Windows- und DOS-Bestandteilen - aber welche? Und wie wende ich sie an?

    Ich danke schon einmal für jegliche Hilfe.

    Stets der Eure

    Carlos



  • kbhit() aus der <conio.h>

    Allerdings läuft das dann nicht gleichzeitig mit Sleep() du müsstest die Sekunden selbstzählen. Auch kaum auffallend ist ein solcher Algo:

    for(unsigned short int i = 0; i <= 5*2; ++i)
    {
        Sleep(500);
        if(kbhit())
            break;
    }
    

    Diese 0,5s Wartezeit fallen kaum auf und helfen trotzdem die Prozessorzeit zu schonen. Umso weniger Wartezeit umso besser, aber umso mehr Durchläufe und umso mehr Prozessorzeit wird benötigt.

    Ohne Sleep() ist die Schleife eine Katastrophe :p

    MfG SideWInder



  • Ja, so geht es, ich danke dir!

    Gibt es eine Möglichkeit, daß die Zeichen, die das Programm zum Ausbrechen aus der Schleife veranlassen, nicht verschluckt werden, sondern zum Beispiel als Beginn eines folgenden cins verwandt werden können?

    Carlos



  • Gibt es eine Möglichkeit, daß die Zeichen, die das Programm zum Ausbrechen aus der Schleife veranlassen, nicht verschluckt werden, sondern zum Beispiel als Beginn eines folgenden cins verwandt werden können?

    Das sollte meines Wissens nach sowieso der Fall sein, weil kbhit() nur überprüft, ob eine Taste gedrückt wurde, ansonsten aber nichts weiter machst. Wenn man an das Zeichen selbst will, muss man ja getch() o.ä. verwenden, es wird also noch im Eingabe-Puffer vorhanden sein.



  • @Carlos
    häng einfach folgendes an die Schleife dran:

    for(unsigned short int i = 0; i <= 5*2; ++i)
    {
        Sleep(500);
        if(kbhit())
            break;
    }
    
    //Überprüft, ob etwas im Tastaturpuffer steht
    //ob also während der Schleife eine Taste gedrückt wurde
    if(kbhit())
    {
       //Eingabe vom Benutzer erfassen bis ENTER gedrückt wird
       fgets(eingabe, sizeof(eingabe), stdin);
    }
    

    Ich verwende fgets() weil dadurch sichergestellt wird, dass es keinen Bufferoverflow gibt, so wie es bei gets() der Fall sein kann. (Nur so nebenbei)



  • Ich danke Euch, das hilft mir sehr weiter.

    Schade ist nur, daß ich im Rest des Programms Elemente der Klasse <string> verwende, keine C-Strings, also die Typen für fgets() umwandeln muss; und daß ich, wenn ich nichts übersehe, die maximale Länge der Eingabe vorher festlegen muß, also evtl. überflüssig Speicherplatz belege, wenn ich mich nicht irre. Aber damit werde ich wohl leben können.

    Carlos



  • Schade ist nur, daß ich im Rest des Programms Elemente der Klasse <string> verwende, keine C-Strings, also die Typen für fgets() umwandeln muss;

    Ist doch eigentlich kein Problem, Du kannst doch auch die C++-Klassen zur Ein- und Ausgabe benutzen. Dann kannst Du Dir das Konvertieren etc sparen. Es ist ja nicht so, als würde das nur mit fgets funktionieren.


Anmelden zum Antworten