Можно предположить таймаут с неперекрывающимся файлом 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);
}