Перекрытый ввод-вывод и ERROR_IO_INCOMPLETE - PullRequest
4 голосов
/ 25 ноября 2010

Я пересекался с IO, работающим в течение 2 лет, но я использовал его с новым приложением, и оно исправляет эту ошибку (когда я скрываю основную форму).

Я гуглил, но не смогПонимаете, что означает ошибка и как я должен ее устранить?

Есть идеи?

Я использую это через NamedPipes, и ошибка возникает после вызова GetOverlappedResult

DWORD dwWait = WaitForMultipleObjects(getNumEvents(), m_hEventsArr, FALSE, 500);

//check result. Get correct data

BOOL fSuccess = GetOverlappedResult(data->hPipe, &data->oOverlap, &cbRet, FALSE);

// error happens here

1 Ответ

6 голосов
/ 25 ноября 2010

ERROR_IO_INCOMPLETE - код ошибки, который означает, что операция перекрытия все еще выполняется;GetOverlappedResult возвращает значение false, поскольку операция еще не завершилась.

У вас есть две опции - блокирующая и неблокирующая:

Блокировать до завершения операции: изменитьВаш GetOverlappedResult вызов:

BOOL fSuccess = GetOverlappedResult(data->hPipe, &data->oOverlap, &cbRet, TRUE);

Это гарантирует, что операция перекрытия завершена (то есть успешно или неудачно) до возврата результата.

Опрос для завершения: если операция все еще выполняется, вы можете вернуться из функции и выполнить другую работу, ожидая результата:

BOOL fSuccess = GetOverlappedResult(data->hPipe, &data->oOverlap, &cbRet, FALSE);
if (!fSuccess) {
    if (GetLastError() == ERROR_IO_INCOMPLETE) return; // operation still in progress

    /* handle error */
} else {
    /* handle success */
}

Как правило, второй вариант предпочтительнее первого, поскольку он незаставить ваше приложение остановиться и дождаться результата.(Однако, если код выполняется в отдельном потоке, первый вариант может быть предпочтительнее.)

...