2016-04-05 10 views
0

Ich versuche, die C + + Standardeingabe Stream Cin zu verwenden, um eine Benutzereingabe zu erhalten, ohne die Ausführung des Programms zu blockieren. Ich habe diesen Code:mit C++ Eingangsstrom cin ohne Blockierung

char ch; 
int flag=1; 

do 
{ 
    if(cin.rdbuf()->in_avail()) 
    { 
     cin.get(ch); 
     flag=0; 
    } 
    else 
     //do something else 
}while(flag); 

//do something with the input 

Die Idee hier ist für die Benutzereingabe warten, ohne zu blockieren, während etwas anderes zu tun, und sobald der Benutzer eine Eingabe liefert wir den Eingang (alle in einem Thread) verarbeiten. Aus der Dokumentation weiß ich, dass die streambuf-Klasse, die vom Eingabedatenstrom verwendet wird, die Funktion in_avail() bereitstellt, die Werte ungleich Null zurückgibt, wenn im Puffer ein Eingabebereitschaftswert vorhanden ist. Der obige Code funktioniert nicht so wie ich es erwartet habe und läuft für immer, selbst wenn ich irgendwann eine Tastatureingabe habe. Ich benutze MS Visual Studio 2005 in Windows 7. Was fehlt mir hier?

+1

Mögliches Duplikat von [Nicht blockierende Konsoleneingabe C++] (http://StackOverflow.com/questions/6171132/non-blocking-console-input-c) – Pierre

+3

in_avail macht nicht, was Sie wollen. Es gibt keine Möglichkeit, das zu tun, was Sie wollen, wenn Sie nur die Standard-C++ - Bibliothek verwenden *, es sei denn, Sie sind bereit, mit mehreren Threads zu arbeiten. –

+0

@n.m Kannst du ein bisschen erklären, warum nicht in_avail das macht, was ich in diesem Fall will? –

Antwort

2

Die Funktion in_avail tut:

Gibt die Anzahl der Zeichen in der get-Bereich.

Der Get-Bereich kann leer sein, auch wenn einige Zeichen aus dem zugrunde liegenden Betriebssystempuffer lesbar sind.

Sie werden eine Auffüllung des get-Bereichs auslösen, wenn Sie effektiv eine Leseoperation auf dem streambuf aufrufen. Und dieser Vorgang wird blockiert. Der Grund dafür ist, dass das Verfahren underflow, die zum Füllen des get-Bereich verantwortlich ist:

Stellt sicher, dass mindestens ein Zeichen im Eingangsbereich vorhanden ist

Und dies zu gewährleisten, muss es bis einige blockieren Charakter wird gelesen.