可能在ReadFile()上有超时?

时间:2010-10-31 12:20:44

标签: c++ windows

while(GetExitCodeProcess(processInfo.hProcess, &exitCode)
        && exitCode == STILL_ACTIVE)
{
    ReadFile(defaultSTDIN, chBuf, 1, &dwRead, 0);
    WriteFile(writingEnd, chBuf, 1, &dwWritten, 0);
}

上面代码的问题是,即使通过processInfo.hProcess引用的子进程已经退出,我们仍然停留在while循环中,因为ReadFile()正在等待输入。什么是解决这个问题的最佳方法?

2 个答案:

答案 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);
    }