Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ ReadFile()上是否可能有超时?_C++_Windows - Fatal编程技术网

C++ ReadFile()上是否可能有超时?

C++ ReadFile()上是否可能有超时?,c++,windows,C++,Windows,上面代码的问题是,即使通过processInfo.hProcess引用的子进程已经退出,我们仍然会陷入while循环,因为ReadFile()正在等待输入。解决这个问题的最好办法是什么 打开文件时,需要使用file\u标志\u OVERLAPPED标志异步读取文件,并为ReadFile函数指定OVERLAPPED结构。然后,您可以等待读取操作和进程终止,并采取适当的行动。可以假设非重叠读取文件超时,但可以间接地 首先,您必须使用设置句柄的超时,特别是必须至少为传递给此函数的设置一个值。(有一点需

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

打开文件时,需要使用
file\u标志\u OVERLAPPED
标志异步读取文件,并为
ReadFile
函数指定
OVERLAPPED
结构。然后,您可以等待读取操作和进程终止,并采取适当的行动。

可以假设非重叠读取文件超时,但可以间接地

首先,您必须使用设置句柄的超时,特别是必须至少为传递给此函数的设置一个值。(有一点需要注意:当句柄指向一个comm端口时,这会起作用,如果该端口实际上是一个正在读取的文件,则不确定它会如何工作。)

通过适当的设置,
ReadFile
函数将在填充完缓冲区、到达文件末尾或到达超时时退出。它不会抛出任何错误或任何东西,因此要确定发生了超时,您需要将&dwRead与预期字节数进行比较。由于只查找1个字节,
如果dwRead=0
则有一个超时,而不是文件的结尾

因此,我写这篇文章的方式(我不能说我遵循了最佳实践或任何东西)是:

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

同意。另外,我已经使用重叠I/O很长时间了。真正缺少的是异步模式下的所有其他文件操作:打开文件、调用
SetEndOfFile
等在NamedPipegood上不起作用。它可能只适用于com端口,因为CreateFile的其他用途可能不会实现CommTimeout。
    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);
    }