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