2016-04-05 10 views
0

プログラムの実行をブロックすることなくユーザー入力を得るために、C++標準入力ストリームcinを使用しようとしています。ブロックせずにC++入力ストリームcinを使用する

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 

ここでの考え方は他とすぐに、ユーザは(1つのスレッドですべての)私たちは、入力を処理する入力を提供するような何かをしながらブロックせずにユーザの入力を待つことです:私はこのコードを持っています。私はドキュメントから、入力ストリームで使用されるstreambufクラスがin_avail()関数を提供することを知っています。この関数はバッファに入力が準備されているときにゼロ以外の値を返します。上記のコードは私が期待していたように動作していないし、ある時点でキーボード入力を提供しても永遠にループしています。私はWindows 7でMS Visual Studio 2005を使用しています。私はここで何が欠けていますか?

+1

[ノンブロッキングコンソール入力C++]の重複の可能性があります(http://stackoverflow.com/questions/6171132/non-blocking-console-input-c) – Pierre

+3

in_availは必要な処理を行いません。あなたが複数のスレッドに対処しない限り、標準のC++ライブラリ*を使ってほしいものを行う方法はありません。 –

+0

@ n.mなぜこのような場合にin_availが私の望むことをしないのか少し説明できますか? –

答えて

2

機能in_availはありません:

は、getエリアで利用可能な文字数を返します。

一部の文字が基になるオペレーティングシステムのバッファから読み取れる場合でも、get領域は空白になることがあります。

streambufで効果的に読み取り操作を呼び出すと、get領域の補充がトリガーされます。その操作はブロックされます。

少なくとも一つの文字が入力エリアに

利用可能であり、これを確実にするために、それはいくつかになるまでブロックしなければならないことを保証します。理由は、getエリアを埋めるための責任がある方法underflowがあることです文字が読み込まれます。

関連する問題