ли иметь Таймаут на ReadFile ()? - PullRequest
6 голосов
/ 31 октября 2010
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 ]

8 голосов
/ 31 октября 2010

Вам нужно асинхронно прочитать файл, используя флаг FILE_FLAG_OVERLAPPED при открытии файла и указав структуру OVERLAPPED для функции ReadFile.Тогда вы можете подождать как операции чтения, так и завершения процесса, и действовать соответствующим образом.

6 голосов
/ 10 февраля 2016

Можно предположить таймаут с неперекрывающимся файлом 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);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...