Ist es möglich ein timeout für std::cin?
Ist es möglich ein timeout für std::cin?
Zum Beispiel std::cin erhält keine Daten, die während eines 10-Sekunden - wirft es eine exception oder gibt eine Fehlermeldung zurück.
Bearbeitet:
Und was ist mit timer von Boost library
? Soweit ich weiß, ist es tragbar Bibliothek. Ist es möglich zu Fragen, timer für Boost-library zu werfen Ausnahmen nach vordefinierten Zeitraum? Ich denke, es kann dieses problem lösen.
- mögliche Duplikate von setzen eines Timeouts, nach ifstream in C++?
- Auf welcher Plattform sind Sie auf?
- Dave, ich brauche zu entwickeln, die ein portables Programm.
- Sie könnten versuchen, Boost.Asio
- kann leicht getan werden mit einem wrapper in C++11 (Irgendwann in der Zukunft 😛 )
- nicht ganz ein Duplikat, da die OP nicht Fragen, für eine linux-spezifische Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist nicht möglich, ein time-out für
std::cin
in einer tragbaren Weise. Auch wenn der Rückgriff auf nicht-portable Techniken, es ist nicht ganz trivial, dies zu tun: Sie müssen zu ersetzenstd::cin
's stream-Puffer.Auf einem UNIX-system würde ich ersetzen die Standard-Streaming-Puffer verwendet
std::cin
durch eine benutzerdefinierte verwendet Datei-Deskriptor0
zum Lesen der Eingabe. Tatsächlich Lesen die Eingabe, die ich benutzen würdepoll()
zu erkennen, die Anwesenheit von input und legen Sie ein timeout für diese Funktion aus. Je nach Ergebnis derpoll()
würde ich entweder Lesen Sie die verfügbaren Eingabe-oder scheitern. Möglicherweise bewältigen eingegebenen Zeichen, die nicht an den Datei-Deskriptor, dennoch kann es sinnvoll sein, auch deaktivieren Sie die Pufferung erfolgt, bis ein newline eingegeben wird.Wenn mehrere threads verwenden, können Sie eine portable filtern stream-Puffer verwendet, die auf thread zu Lesen der eigentlichen Daten und einem anderen thread zu verwenden, die eine zeitgesteuerte bedingungsvariable wartet der erste thread zu signalisieren, dass es empfangene Daten oder für die Zeit abläuft. Beachten Sie, dass Sie guard gegen spurious wake-ups, um sicherzustellen, dass die timeout-Zeit ist in der Tat erreicht, wenn es keine Eingabe. Dies würde vermeiden, zu basteln, mit der tatsächlichen Art und Weise Daten gelesen
std::cin
obwohl es noch immer ersetzt die stream-Puffer verwendetstd::cin
um die Funktionen erreichen Sie über diesen Namen.std::cin
blockiert diesen thread und er wird nicht zurückkommen. Es ist nichts tragbares zu unterbrechen, ein system call, soweit ich weiß.0
und das ist, wasstdin
undstd::cin
verbunden sind. Die default-Implementierung fürstd::cin
nicht unterstützt Einstellung ein timeout, aber mit dem system callpoll()
ist es möglich, time-out, wenn es keine Veranstaltung im angegebenen Zeitraum.io_service
, die verwendet werden können, für single-threaded-asynchrone Operationen. Siehe die Antwort, die leider nicht viel mehr als ein link auf ein Beispiel. Auch scheint es, dass dies insbesondere die Boost-Funktion wird nicht tragbar; Hinweis: dieifdef
s und das Wortposix
bestreut im gesamten.Ich gerade herausgefunden, wie zu tun, dass der Abruf der std::cin Datei-Deskriptor.
poll-Funktion gibt 0 zurück, wenn eine Zeitüberschreitung Auftritt und kein Ereignis eingetreten ist, 1, wenn etwas passiert ist, und -1 wenn Fehler passiert.
select()
hat bei mir nicht funktioniert in Kombination mitgetline(std::cin, ...)
, aberpoll()
haben.