2010-11-25 2 views
3

IO를 2 년 동안 겹쳐 쓰지만 이제는 새로운 응용 프로그램과 함께이 오류를 내게 사용했습니다 (기본 양식을 숨길 때).중복 된 IO 및 ERROR_IO_INCOMPLETE

나는 봤지만 나는 오류의 의미와 내가 어떻게 처리해야하는지 이해하지 못한다.

아이디어가 있으십니까?

임 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 
+2

중복 된 I/O는 I/O 작업과 관련이 있습니다. 소켓, 디스크 등 '. 당신이하고있는 I/O의 종류와 당신이 얻고있는 정확한 오류는 무엇인지 말해주십시오. – Poni

+0

@poni 제 편집보기 – Lodle

답변

6

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 */ 
} 

, 두 번째 옵션에 바람직하다 첫 번째는 응용 프로그램이 멈추고 결과를 기다리지 않기 때문입니다. 그러나 코드가 별도의 스레드에서 실행되는 경우 첫 번째 옵션이 더 바람직 할 수 있습니다.

+0

변경 사항을 기다렸습니다. 그냥 멀리 해협을 반환합니다. – Lodle

+0

죄송합니다. 나는 대답을 업데이트 할 것이다. –

+1

코드의 어느 부분에'data-> oOverlap'이 설정되어 있습니까? 즉, 어떤 함수가 처음으로 그것을 호출할까요? –