我有通过stdinHandle = GetStdHandle(STD_INPUT_HANDLE)获得的句柄,并且有单独的线程执行这样的代码:
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将程序的输入重定向到管道的其他程序运行时,代码会挂起。
那么我应该如何以while (!timeToExit)..方式阻止win32线程呢?或者我应该如何改变while (!timeToExit)..线程来阻止它呢?
Update我想过在调用ReadFile之前使用stdin和ReadFile作为参数,并在其他线程中触发事件,但是没有提到匿名管道作为WaitForMultipleObjects的可能输入,而且当stdin连接到控制台时,它变得毫无用处(总是毫不延迟地返回控制),看起来在这种情况下我不得不使用ReadConsoleInput,而不是ReadFile。
发布于 2016-05-16 22:01:36
当从控制台的实际STDIN读取时,可以使用PeekConsoleInput()和ReadConsoleInfo()而不是ReadFile()。
当从(Un)命名管道读取时,在调用PeekNamedPipe()之前使用ReadFile()。
这将允许您在实际读取新输入之前轮询STDIN,然后可以在轮询之间检查线程终止状态。
您可以使用GetFileType()来检测将何种设备附加到您的STD_INPUT_HANDLE句柄。
发布于 2016-05-16 20:10:52
最安全的方法是使用重叠结构等异步调用ReadFile (非阻塞)。这可以从您的主线程执行。
如果/当您需要取消它时,调用CancelIo (来自调用ReadFile的同一个线程)或调用CancelIoEx (如果来自另一个线程)。
您可能能够使当前的方法工作;如果将timeToExit标记为易失性,它可能不会挂起,但该方法通常会产生更大的问题。
https://stackoverflow.com/questions/37261889
复制相似问题