win32:如何停止ReadFile(stdin |管道)

fgh*_*ghj 2 c++ winapi

我有通过处理,我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)

哪里timeToExitstd::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

Rem*_*eau 5

从控制台的实际STDIN读取时,您可以使用PeekConsoleInput()ReadConsoleInfo()不是ReadFile().

从(未)命名管道读取时,请PeekNamedPipe()在调用之前使用ReadFile().

这将允许您在实际读取之前轮询STDIN以获取新输入,然后您可以在两次轮询之间检查线程终止状态.

您可以使用它GetFileType()来检测STD_INPUT_HANDLE手柄上连接的设备类型.