2010-08-09 8 views
0

Программа работает нормально в течение нескольких минут, а затем ReadFile начинает сбой с кодом ошибки ERROR_WORKING_SET_QUOTA.Вызов ReadFile return ERROR_WORKING_SET_QUOTA

Я использую ReadFile с перекрытого ввода/вывода, как так:

while (continueReading) 
{ 
    BOOL bSuccess = ReadFile(deviceHandle, pReadBuf, length, 
          &bytesRead, readOverlappedPtr); 
    waitVal = WaitForMultipleObjects(
       (sizeof(eventsToWaitFor)/sizeof(eventsToWaitFor[0])), 
       eventsToWaitFor, FALSE, INFINITE); 
    if (waitVal == WAIT_OBJECT_0) { 
     // do stuff 
    } else if (waitVal == WAIT_OBJECT_0 + 1) { 
     // do stuff 
    } else if (waitVal == WAIT_OBJECT_0 + 2) { 
     // complete the read 
     bSuccess = GetOverlappedResult(deviceHandle, &readOverlapped, 
             &bytesRead, FALSE); 
     if (!bSuccess) { 
      errorCode = GetLastError(); 
      printf("ReadFile error=%d\n", errorCode); 
     } 
    } 
} 

Почему я получаю эту ошибку?

ответ

0

Проблема в том, что ReadFile получает вызов больше времени, чем GetOverlappedResult. Причинение процесса исчерпанию ресурсов для решения всех выдающихся чтений.

Кроме того, мы должны проверить результат ReadFile и убедиться, что результатом является ERROR_IO_PENDING, если это не так, и ReadFile возвращается FALSE, тогда возникает другая проблема.

Убедитесь, что GetOverlappedResult вызывается один раз для каждого вызова ReadFile. Например:

BOOL bPerformRead = TRUE; 
while (continueReading) 
{ 
    BOOL bSuccess = TRUE; 
    // only perform the read if the last one has finished 
    if (bPerformRead) { 
     bSuccess = ReadFile(deviceHandle, pReadBuf, length, 
          &bytesRead, readOverlappedPtr); 
     if (!bSuccess) { 
      errorCode = GetLastError(); 
      if (errorCode != ERROR_IO_PENDING) { 
      printf("ReadFile error=%d\n", errorCode); 
      return; 
      } 
     } else { 
      // read completed right away 
      continue; 
     } 
     // we can't perform another read until this one finishes 
     bPerformRead = FALSE; 
    } 
    waitVal = WaitForMultipleObjects( 
       (sizeof(eventsToWaitFor)/sizeof(eventsToWaitFor[0])), 
       eventsToWaitFor, FALSE, INFINITE); 
    if (waitVal == WAIT_OBJECT_0) { 
     // do stuff 
    } else if (waitVal == WAIT_OBJECT_0 + 1) { 
     // do stuff 
    } else if (waitVal == WAIT_OBJECT_0 + 2) { 
     // complete the read 
     bSuccess = GetOverlappedResult(deviceHandle, &readOverlapped, 
             &bytesRead, FALSE); 
     // the read is finished, we can read again 
     bPerformRead = TRUE; 
     if (!bSuccess) { 
      errorCode = GetLastError(); 
      printf("GetOverlappedResult from ReadFile error=%d\n", errorCode); 
     } 
    } 
} 
+1

Ближе. Но на самом деле проверка того, что ReadFile возвращает FALSE и GetLastError(), возвращает ERROR_IO_PENDING * очень важно. Чтение файлов часто завершается немедленно, когда данные поступают из кеша файловой системы. –

+0

Спасибо, обновлено, чтобы включить ваши предложения. –