【发布时间】:2016-05-16 19:35:21
【问题描述】:
我有通过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 将我的程序的输入重定向到管道。
那么我应该如何以win32方式停止while (!timeToExit)..线程?
或者我应该如何更改while (!timeToExit).. 线程以使其成为可能
阻止它?
更新
在调用ReadFile 之前,我考虑过使用WaitForMultipleObjects
stdin 和 event 作为参数,并在其他线程中触发事件,
但是没有提到匿名管道作为WaitForMultipleObjects 的可能输入,而且我在标准输入连接到控制台时尝试过,
并且在第一个字符输入控制台后它变得无用(总是立即返回控制),
看起来在这种情况下我必须使用ReadConsoleInput,而不是ReadFile?
【问题讨论】:
-
WaitForMultipleObjects()可以处理命名或未命名的管道以及控制台。 -
@wilx
WaitForMultipleObjects以奇怪的方式处理事情,如果运行我的程序的进程将 0 字节写入“管道”标准输入,那么它返回(在第一次调用之后)WAIT_OBJECT_0,但 @987654339 @ 甚至无法读取 1 个字节,所以我回到问题中提到的问题,我们有ReadFile等待输入。 -
那么不要写0字节?
-
@wilx 我不能,我的应用程序只能从标准输入读取,运行我的程序的程序是外部应用程序。我有它的源代码,但我怀疑我可以合并它的任何更改。而且它不会写入 0 字节,它会以其他方式导致
WAIT_OBJECT_0事件,但我仍然不知道如何。可能与我的 x64 构建与 x86 构建的外部程序有关。 -
@wilx if run program from
cmd.exe我得到了相同的结果 - 我没有输入任何内容,但WaitForMultipleObjects返回WAIT_OBJECT_0