我有通过处理,我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
}
Run Code Online (Sandbox Code Playgroud)
哪里timeToExit是std::atomic<bool>.
我想从另一个线程中阻止这个线程.我试过这个:
timeToExit = true;
CloseHandle(stdinHandle);
Run Code Online (Sandbox Code Playgroud)
和代码挂起CloseHandle.
当程序由其他程序运行时代码挂起,该程序使用
CreatePipe并将DuplicateHandle程序的输入重定向到管道.
那么我应该如何while (!timeToExit)..以win32方式停止线程?或者可能是我应该如何更改while (!timeToExit)..线程以使其可以阻止它?
更新
我考虑过使用stdin和event WaitForMultipleObjects之前的ReadFile参数作为参数,并在其他线程中触发事件,但是没有提到匿名管道作为可能的输入WaitForMultipleObjects,加上我尝试当stdin连接到控制台时,它变得无用(在输入控制台的第一个字符之后总是返回控制,看起来我必须ReadConsoleInput在这种情况下使用,而不是ReadFile?
从控制台的实际STDIN读取时,您可以使用PeekConsoleInput()而ReadConsoleInfo()不是ReadFile().
从(未)命名管道读取时,请PeekNamedPipe()在调用之前使用ReadFile().
这将允许您在实际读取之前轮询STDIN以获取新输入,然后您可以在两次轮询之间检查线程终止状态.
您可以使用它GetFileType()来检测STD_INPUT_HANDLE手柄上连接的设备类型.
| 归档时间: |
|
| 查看次数: |
1611 次 |
| 最近记录: |