2010-08-09 5 views
0

을 반환합니다.통화 프로그램은 몇 분 동안 잘 실행하고 ReadFile을 오류 코드 ERROR_WORKING_SET_QUOTA에 실패 시작 ERROR_WORKING_SET_QUOTA

내가 중첩 된 I과 ReadFile을 사용하고/O 같은 :

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을 결과를 확인해야하고하지 않고 ReadFile을 다음 또 다른 문제가 FALSE 반환하는 경우, 결과는 ERROR_IO_PENDING되어 있는지 확인합니다.

는 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

가까이. 그러나 실제로 *() ERROR_IO_PENDING가 반환 ReadFile을가 FALSE와 GetLastError 반환하는 것이 매우 * 중요합니다 확인. 파일 읽기는 파일 시스템 캐시에서 데이터가 나오면 즉시 완료됩니다. –

+0

감사의 말 귀하의 제안을 반영하도록 업데이트되었습니다. –