2012-03-13 8 views
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

答えて

2

純粋にC++のレベルでこれを行う方法はありません。 をOSレベルに落とすか、curses(または 多分いくつかの非同期IOライブラリ)を使用して、cin を非同期に読み込むことができます。

+0

これはBoostの一部の機能では実行できません。また、私はVisual C++で作業していますが、MSはこれを行うための機能を提供しています(未テスト - http://www.tech-archive.net/Archive/VC/microsoft.public.vc.language/2007-01/を参照)。 msg00389.html)、これは生産コードではなく、私がどのように錆びているかを見るための自己テストであるため、そのような目的を破るものです。 – taz

+0

@taz私は 'boost :: asio'が開いている' istream'とどうやって相互作用するのか分かりません。非同期入力をストリームに接続することができれば、非ブロッキングの読み込みを使用して、そこにあるすべてのものを読み込み、取り除くことができます。しかし、私はおそらくそれを 'cin'で動作させようとはしません。非同期読み取りと 'cin'バッファとの間の相互作用は特定されない可能性が高い。 –

+0

よく見かけますが、私は標準がサポートしていない何かをすぐに試みるのに十分なほど錆びています。予備調査から、あなたが正しいと思われます。これは '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

関連する問題