首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >win32:如何停止ReadFile (Stdin ReadFile)

win32:如何停止ReadFile (Stdin ReadFile)
EN

Stack Overflow用户
提问于 2016-05-16 19:35:21
回答 2查看 3.1K关注 0票数 2

我有通过stdinHandle = GetStdHandle(STD_INPUT_HANDLE)获得的句柄,并且有单独的线程执行这样的代码:

代码语言:javascript
复制
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
}

其中timeToExitstd::atomic<bool>

我想从另一条线上阻止这条线。我试过这个:

代码语言:javascript
复制
timeToExit = true;
CloseHandle(stdinHandle);

代码挂在CloseHandle中。

当使用CreatePipeDuplicateHandle将程序的输入重定向到管道的其他程序运行时,代码会挂起。

那么我应该如何以while (!timeToExit)..方式阻止win32线程呢?或者我应该如何改变while (!timeToExit)..线程来阻止它呢?

Update我想过在调用ReadFile之前使用stdin和ReadFile作为参数,并在其他线程中触发事件,但是没有提到匿名管道作为WaitForMultipleObjects的可能输入,而且当stdin连接到控制台时,它变得毫无用处(总是毫不延迟地返回控制),看起来在这种情况下我不得不使用ReadConsoleInput,而不是ReadFile

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-16 22:01:36

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

当从(Un)命名管道读取时,在调用PeekNamedPipe()之前使用ReadFile()

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

您可以使用GetFileType()来检测将何种设备附加到您的STD_INPUT_HANDLE句柄。

票数 6
EN

Stack Overflow用户

发布于 2016-05-16 20:10:52

最安全的方法是使用重叠结构等异步调用ReadFile (非阻塞)。这可以从您的主线程执行。

如果/当您需要取消它时,调用CancelIo (来自调用ReadFile的同一个线程)或调用CancelIoEx (如果来自另一个线程)。

您可能能够使当前的方法工作;如果将timeToExit标记为易失性,它可能不会挂起,但该方法通常会产生更大的问题。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37261889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档