我有把手,我通过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