2011-04-11 26 views
15

コンソールからノンブロッキング読み取り機能が必要です。Cでの標準I/Oからのノンブロッキング読み出し

+5

なぜこれが本当の問題ではないのですか?私は重複としてそれを閉じることを理解するだろうが、 "本当の質問ではない"として私に奇妙に見えます。 – CodesInChaos

+0

@Mitch Wheat:ReadKeyがブロックされていませんか? – jgauffin

+0

@Mitchあなたは少なくとも 'KeyAvailable'と' ReadKey'を組み合わせる必要があります。そして、それが正しいことなのか、リダイレクトされた入力キーやデッドキーとのやりとりの仕方がまだ分かりません。それは確かに些細な質問ではありません。 – CodesInChaos

答えて

5
var buf=new byte[2048]; 
var inputStream=Console.OpenStandardInput(); //dispose me when you're done 
inputStream.BeginRead(buf,0,buf.Length,ar=>{ 
    int amtRead=inputStream.EndRead(ar); 
    //buf has what you need. You'll need to decode it though 
},null); 
+0

countパラメータを忘れていませんか? – CodesInChaos

+0

...はい。ありがとう! – spender

+0

あなたの 'EndRead'はいつ呼び出されますか?私はあなたがストリームの終わりに到着した場合、またはバッファがいっぱいになった場合にのみ、入力のわずかな文字しか利用できない場合ではないと思います。 – CodesInChaos

38

Richard Duttonhis blog上の解決策を持っています

while (true) 
{ 
    if (Console.KeyAvailable) 
    { 
     ConsoleKeyInfo key = Console.ReadKey(true); 
     switch (key.Key) 
     { 
      case ConsoleKey.F1: 
       Console.WriteLine("You pressed F1!"); 
       break; 
      default: 
       break; 
     } 
    } 
    // Do something more useful 
} 
+0

'ConsoleKeyInfo'は' char'表現を表す 'KeyChar'フィールドを含んでいます。これはOPが望むものかもしれません。 – CodesInChaos

+1

本当に?キーが利用可能になるまで、できるだけ早くループを回すだけですか?それは愚かです。 – spender

+12

@spenderだからこそ、そこには '何かもっと役に立つもの'というコメントがあります。 – CodesInChaos

関連する問題