を私はstdinHandle = GetStdHandle(STD_INPUT_HANDLE)
を経由して得たハンドルを持っていると私は、このようなコードを実行する別のスレッドを持っている:timeToExit
がstd::atomic<bool>
あるのWin32:ReadFile関数を停止する方法(STDIN |パイプ)
while (!timeToExit) {
char ch;
DWORD readBytes = 0;
if (!::ReadFile(stdinHandle, &ch, sizeof(ch), &readBytes, nullptr)) {
//report error
return;
}
if (readBytes == 0)
break;
//handle new byte
}
。
他のスレッドからこのスレッドを停止することもできます。私はこれを試みた:
timeToExit = true;
CloseHandle(stdinHandle);
そしてコードはCloseHandle
でハングアップします。
CreatePipe
とDuplicateHandle
を使用して他のプログラムでプログラムを実行しているときにコードがハングし、自分のプログラムの入力をパイプにリダイレクトします。
したがって、私はスレッドをwin32の方法で停止する必要がありますか? または私はいくつかの方法を変更する必要がありますwhile (!timeToExit)..
それを停止するスレッドを可能にするには?
更新 は、私は、引数として stdinとイベントにReadFile
の呼び出しの前WaitForMultipleObjects
の使用について考え、そして他のスレッドでイベントをトリガし、 しかしWaitForMultipleObjects
のための可能な入力として匿名パイプについての言及はない、プラスI コンソールにstdinを接続しようとしたときに、最初の文字がコンソールに入力された後で無駄になります( )ReadFile
の代わりにReadConsoleInput
を使用する必要がありますか?
WaitForMultipleObjects()は、名前の付いたパイプと名前のないパイプとコンソールも処理できます。私のプログラムを実行するプロセスは、標準入力を「パイプ」に0バイトを書く場合 – wilx
@wilxは 'WaitForMultipleObjects'は奇妙な方法で物事を処理し、それは' WAIT_OBJECT_0'(最初の呼び出し後に)返しますが、 'ReadFile'も、1バイトを読み取ることができません私は問題の問題に戻ります。入力を待つ 'ReadFile'があります。 – fghj
0バイトを書き込まないでください。 – wilx