while(GetExitCodeProcess(processInfo.hProcess, &exitCode)
&& exitCode == STILL_ACTIVE)
{
ReadFile(defaultSTDIN, chBuf, 1, &dwRead, 0);
WriteFile(writingEnd, chBuf, 1, &dwWritten, 0);
}
Run Code Online (Sandbox Code Playgroud)
上面代码的问题是,即使通过processInfo.hProcess引用的子进程已经退出,我们仍然停留在while循环中,因为ReadFile()正在等待输入.什么是解决这个问题的最佳方法?
您需要的是FILE_FLAG_OVERLAPPED
在打开文件时使用标志异步读取文件,并指定函数的OVERLAPPED
结构ReadFile
.然后,您可以等待读取操作和进程终止,并采取适当的措施.
小智 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);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8475 次 |
最近记录: |