std::cin zeitlich begrenzen
-
Hallo zusammen,
ich hätte mal eine Frage an die Community, da die Internetrecherche nichts vielversprechendes ergab und zwar möchte ich eine CIN Eingabe zeitlich begrenzen. Das bedeutet, das mein Programm bis zu einem gewissen Punkt ausgeführt wird und eine Eingabe vom Benutzer verlangt, wird die Eingabezeit (bspw. 10 Sek) überschritten wird ein default Wert verwendet und weiter gemacht.
Wäre sowas in C++ leicht umzusetzen? Bislang habe ich gelesen, dass man dafür einen zweiten Thread macht, den ersten pausiert und nach x Sekunden dann weitermacht mit Thread 1 und Thread 2 schließt.
Wäre über Ratschläge dankbar.
PS: Das Problem das ich gerade habe ist, dass CIN eine Eingabe erwartet. Wenn ich bspw. mit einer while Schleife arbeite, funktioniert das nicht, das bei
std::cin>> vardas Programm steht bis eine Eingabe kommt (aber das wisst ihr ja alle).
Grüße Tobi
-
Shor-ty schrieb:
Wäre sowas in C++ leicht umzusetzen?
Nicht mit Standard C++ und cin.
-
Danke für die schnelle Antwort.
Was wäre eine Alternative? Stichworte reichen, dann kann ich mich selber schlau machen.
-
Ich denke mit den Begriffen "Filedeskriptor", "stdin", "read" und "select" kannst du was finden. Ist aber alles plattformabhängig.
-
Okay vielen Dank, dann werde ich mich mal schlau machen.
-
Mh, wieso?
Kann er nicht einen zweiten Thread für die Eingabe mit std::cin aufmachen und immer wieder prüfen, ob da ein Ergebnis kam, und halt nach x Sekunden den Thread abschiessen?
-
Du kannst mit Standard C++ keine Threads abschießen
-
Sagt ja auch keiner. Aber man muss sich ja nicht mehr für den Thread interessieren

Hier mal so als Proof-of-Concept (Das ist kein schöner Code! Er soll nur das Prinzip zeigen!)
#include <iostream> #include <future> #include <chrono> int userInput() { std::cout << "Gib was ein: "; int val; std::cin >> val; return val; } template<class T> double dif(T t) { using namespace std; using namespace std::chrono; auto now = high_resolution_clock::now(); return duration_cast<duration<double>>(now - t).count(); } int main() { const auto waitTime = std::chrono::seconds(5); const int defaultValue = 5; auto input = std::async(std::launch::async, userInput); auto start = std::chrono::high_resolution_clock::now(); while (input.wait_for(std::chrono::milliseconds(500)) == std::future_status::timeout) { std::cout << "."; if (dif(start) >= waitTime.count()) break; } int value = defaultValue; if (input.wait_for(std::chrono::milliseconds(0)) != std::future_status::timeout) value = input.get(); std::cout << "\nValue: " << value << std::endl; return 0; }
-
patrick246 schrieb:
Du kannst mit Standard C++ keine Threads abschießen
Nicht direkt, aber der 10 Sekunden-Warte-Thread könnte nach 10sec was nach cin schreiben.
Ich weiss aber nicht, ob das Standard-Konform ist und generell ist es wohl keine gute Idee, in dem Fall mit cin zu arbeiten.