我有把手,我通過stdinHandle = GetStdHandle(STD_INPUT_HANDLE)
了,我有單獨的線程執行其代碼等:的Win32:如何停止的ReadFile(標準輸入|管)
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
是std::atomic<bool>
。
我婉從另一個線程停止此線程。我試過這個:
timeToExit = true;
CloseHandle(stdinHandle);
和代碼掛在CloseHandle
。
代碼在程序運行時由其他程序掛起,程序使用 CreatePipe
和DuplicateHandle
將我的程序輸入重定向到管道。
那麼應該怎麼停在Win32方式while (!timeToExit)..
線程? 或者可能是我應該如何改變while (!timeToExit)..
的線程使其成爲可能 來阻止它?
更新 我想和 標準輸入和事件作爲參數的ReadFile
調用之前的WaitForMultipleObjects
使用,並觸發事件在其他線程, 但對於WaitForMultipleObjects
沒有提到匿名管道盡可能的投入,再加上我當標準輸入連接試圖安慰, 它變得無用輸入到控制檯的第一個字符後(始終沒有延遲返回控制), 看起來像我在這種情況下使用ReadConsoleInput
,而不是ReadFile
?
'WaitForMultipleObjects()'可以處理命名或未命名的管道以及控制檯。 – wilx
@wilx'WaitForMultipleObjects'以奇怪的方式處理事情,如果運行我的程序的進程將0字節寫入「管道」標準輸入,然後它返回(在第一次調用之後)'WAIT_OBJECT_0',但是'ReadFile'甚至不能讀取1個字節,所以我回到問題提到的問題,我們有'ReadFile'等待輸入。 – fghj
那麼不要寫0字節? – wilx