문제

I/O 완료 포트를 사용한 비동기 작업은 전송 된 0 바이트를 반환하지만 I/O 작업은 예상대로 작동합니다 (내 읽기 버퍼가 가득 찼습니다).

BYTE buffer[1024] = {0};
OVERLAPPED o = {0};
HANDLE file = CreateFile(
    _T("hello.txt"),
    GENERIC_READ,
    FILE_SHARE_READ,
    NULL,
    OPEN_EXISTING,
    FILE_FLAG_OVERLAPPED,
    NULL
);
HANDLE completion_port = CreateIoCompletionPort(
    file,
    NULL,
    0,
    0
);
ReadFile(
    file,
    buffer,
    1024,
    NULL,
    &o
);

작업 스레드에서 :

DWORD numBytes = 0;
LPOVERLAPPED po;
GetQueuedCompletionStatus(
    completion_port,
    &numBytes,
    0,
    &po,
    INFINITE
);
GetOverlappedResult(file, &o, &numBytes, FALSE);

두 기능 모두 Numbytes에서 0 바이트를 반환하지만 buffer 채우고 있습니다. 이것이 예상되는 행동입니까?

감사.

도움이 되었습니까?

해결책

을 위한 GetIoCompletionPort 올바르게 작동하려면 널 비 널 포인터를 ULONG_PTR '키'값을 다음과 같이 쓸 수 있습니다.

ULONG_PTR key;

GetQueuedCompletionStatus(
    completion_port,
    &numBytes,
    &key,
    &po,
    INFINITE
);

사용 GetOverlappedResult 성공적으로, 나는 당신이 이벤트 핸들을 지정해야한다고 생각합니다. OVERLAPPED 구조 (어떤 경우에도 강력하게 권장) :

o.hEvent = CreateEvent(NULL, FALSE, TRUE, NULL);

당신이 그랬던 것처럼 두 사람을 연속으로 부르는 것은 실제로 많은 것을 성취하지 못합니다. 둘 다 같은 것에 대해 말해줍니다. 두 사람 모두에게 전화를 걸면 세 번째 매개 변수를 CreateEvent 사실. 내 생각에 당신은 당신이 일을 할 수 있는지 알아보기 위해 둘 다 노력하고 있다는 것입니다. 모든 것을 고려했을 것입니다 GetQueuedCompletionStatus, 그것에 두십시오. 물론, 당신은 보통 한 번 전화를 걸고 종료하는 것보다 더 많은 일을 할 것입니다. 일반적으로 루프로 호출하고 읽은 현재 버퍼를 처리 한 다음 ReadFile 다시 정보의 다른 버퍼를 읽으려면 다음과 같은 것입니다.

DWORD numBytes;
LPOVERLAPPED po;
while (GetQueuedCompletionStatus(completion_port, &numBytes, &key, &po, INFINITE)) {
    std::cout << "\rRead: " << numBytes; // just to show it's set correctly.
    process(buffer);
    po->offset += sizeof(buffer);
    ReadFile(file, buffer, sizeof(buffer), NULL, po);
}

적어도 내 컴퓨터에서 빠른 테스트에서 이것은 바이트 수가 올바르게 읽었습니다 (sizeof(buffer) 마지막 패킷까지 파일의 나머지 크기).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top