0
私は、将来5秒間実行するタイマースレッドと、それが実行を終了するのを待つループを持っています。次に、ユーザーがエンターを押すとプログラムが終了します。私は、ループを待っている間、入力が入力バッファに受け入れられ、プログラムの終了に使用されたことに気付きました。その後の入力ヒットはコマンドラインにと入力されました!改行を含む入力バッファーをクリアします
入力を含む「入力を終了するには」入力する前に入力したすべての入力を無視します。私がC++で作業して以来、しばらくありました。私はこれを行う方法を覚えていません(私はSOとGoogleを検索しましたが、この特定の質問に対する答えは見つかりません)。ここに私の例である:
std::cout << "Timer test: wait 5 seconds\n";
boost::asio::io_service test_io;
deadline_timer test_timer(test_io, posix_time::seconds(5));
int testInt = 0;
auto asynctest = [&testInt](const boost::system::error_code&) {
std::cout << "Running asynctest()\n";
testInt = 5;
};
std::cout << "Starting asynchtest, which should output in 5 seconds\n";
test_timer.async_wait(boost::bind<void>(asynctest, boost::asio::placeholders::error));
while(testInt != 5) {
std::cout << ". ";
boost::this_thread::sleep(boost::posix_time::milliseconds(200));
}
// How do I clear all input from the input stream here so that if the user hit enter
// during the timer countdown it will be cleared and user still must hit enter to
// exit program?
std::cout << "Press enter to exit\n";
std::cin.ignore(80, '\n');
return 1;
ADSF
これはBoostの一部の機能では実行できません。また、私はVisual C++で作業していますが、MSはこれを行うための機能を提供しています(未テスト - http://www.tech-archive.net/Archive/VC/microsoft.public.vc.language/2007-01/を参照)。 msg00389.html)、これは生産コードではなく、私がどのように錆びているかを見るための自己テストであるため、そのような目的を破るものです。 – taz
@taz私は 'boost :: asio'が開いている' istream'とどうやって相互作用するのか分かりません。非同期入力をストリームに接続することができれば、非ブロッキングの読み込みを使用して、そこにあるすべてのものを読み込み、取り除くことができます。しかし、私はおそらくそれを 'cin'で動作させようとはしません。非同期読み取りと 'cin'バッファとの間の相互作用は特定されない可能性が高い。 –
よく見かけますが、私は標準がサポートしていない何かをすぐに試みるのに十分なほど錆びています。予備調査から、あなたが正しいと思われます。これは 'boost :: asio'でうまくいくかもしれません。スレッドを必要とするかもしれません。 C++のiostreamsは、IOをノンブロッキングしません。 私はちょうど練習しているので、これをさらにテストするつもりはありません。うまくいけば、将来的に誰かが頭痛の種になることはないでしょう。ご協力いただきありがとうございます。 追加情報: http://www.gamedev.net/topic/538714-asynchronous-console-input/ http://bytes.com/topic/c/answers/841283-how-make-non-blocking -call-cin – taz