可能在ReadFile()上有超时?

aCu*_*ria 7 c++ windows

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()正在等待输入.什么是解决这个问题的最佳方法?

yon*_*evy 8

您需要的是FILE_FLAG_OVERLAPPED在打开文件时使用标志异步读取文件,并指定函数的OVERLAPPED结构ReadFile.然后,您可以等待读取操作和进程终止,并采取适当的措施.

  • +1你介意举一个例子吗? (8认同)

小智 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)