while(GetExitCodeProcess(processInfo.hProcess, &exitCode)
&& exitCode == STILL_ACTIVE)
{
ReadFile(defaultSTDIN, chBuf, 1, &dwRead, 0);
WriteFile(writingEnd, chBuf, 1, &dwWritten, 0);
}
上面代码的问题是,即使通过processInfo.hProcess引用的子进程已经退出,我们仍然停留在while循环中,因为ReadFile()正在等待输入。什么是解决这个问题的最佳方法?
答案 0 :(得分:8)
您需要的是在打开文件时使用FILE_FLAG_OVERLAPPED
标志异步读取文件,并为OVERLAPPED
函数指定ReadFile
结构。然后你可以等待读取操作和进程终止,并采取适当的行动。
答案 1 :(得分:6)
可以假设使用非重叠的ReadFile超时,但是间接地。
首先,您必须使用SetCommTimeouts设置句柄的超时,特别是必须至少设置为传递给此函数的ReadTotalTimeoutConstant的值。 (一个警告:当你的句柄指向一个通信端口时,这种方法有效,如果它实际上是一个正在读取的文件,则不确定它是如何工作的。)
通过适当的设置,ReadFile
函数将在完成填充缓冲区,到达文件末尾或达到超时时启动。它不会抛出任何错误或任何其他因此确定发生超时您需要将& dwRead 与预期字节数进行比较。因为你只需要1个字节if dwRead = 0
,所以你有一个超时,而不是文件的结尾。
所以我写它的方式(并且我不能声称我遵循最佳做法或其他任何方式)是要做以下事情:
COMMTIMEOUTS timeouts = { 0, //interval timeout. 0 = not used
0, // read multiplier
10, // read constant (milliseconds)
0, // Write multiplier
0 // Write Constant
};
SetCommTimeouts(defaultSTDIN, &timeouts);
while(GetExitCodeProcess(processInfo.hProcess, &exitCode)
&& exitCode == STILL_ACTIVE)
{
ReadFile(defaultSTDIN, chBuf, 1, &dwRead, 0);
if (dwRead == 0) {
//insert code to handle timeout here
}
WriteFile(writingEnd, chBuf, 1, &dwWritten, 0);
}