2010-08-09 6 views
0

Le programme s'exécute correctement pendant quelques minutes, puis ReadFile commence à échouer avec le code d'erreur ERROR_WORKING_SET_QUOTA.Appels vers ReadFile return ERROR_WORKING_SET_QUOTA

J'utilise ReadFile avec I chevauché/O comme ceci:

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); 
     } 
    } 
} 

Pourquoi ai-je cette erreur?

Répondre

0

Le problème est que ReadFile est appelé plus de fois que GetOverlappedResult. Causer le processus à court de ressources pour faire face à toutes les lectures en suspens.

En outre, nous devrions vérifier le résultat de ReadFile et nous assurer que le résultat est ERROR_IO_PENDING, si ce n'est pas le cas et si ReadFile a retourné FALSE, il y a un autre problème.

Vérifiez que GetOverlappedResult est appelé une fois pour chaque appel à ReadFile. Comme si:

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

Plus proche. Mais vérifier réellement que ReadFile retourne FALSE et GetLastError() renvoie ERROR_IO_PENDING est très important. La lecture des fichiers se termine souvent immédiatement lorsque les données sortent du cache du système de fichiers. –

+0

Merci, mis à jour pour intégrer vos suggestions. –