필자는 직렬 포트에서 읽고 쓰는 코드 (멀티 스레드 코드)를 여러 가지 소스로 작성했습니다. 그것은 잘 작동합니다 ... 직렬 포트에서 읽기를 수행하는 쓰레드의 루프가 의도하지 않게 대기 중이다. 기본적으로 반복되는 것은 다음과 같습니다.비동기 직렬 통신 : 왜 ReadFile()은 OVERLAPPED 구조체에 이벤트를 설정합니까?
- 이벤트 (읽기 루프 외부에서 생성 됨)가 재설정되고 해당 핸들이 OVERLAPPED 구조체의 hEvent 멤버로 사용됩니다.
- 에서 ReadFile() (다른 매개 변수들)을 OVERLAPPED 구조체를 전달하고 즉시 반환
- 의 WaitForSingleObject()는 OVERLAPPED 구조체의 이벤트에 대기하지만, 항상 이벤트가 항상 ReadFile을 한 후 설정 때문에 즉시 반환()
- GetOverlappedResult()는 같은 OVERLAPPED 구조체가 성공적으로 반환 통과하지만, 일반적으로 만 0 바이트
내 기대가 이벤트의 전체 포인트가 읽을 수있는 데이터가있을 때 신호를이었다이었다 읽고 다음있다. 그러나 ReadFile()은 이벤트를 설정하기 때문에 그 요점은 무엇입니까? 내가 뭘 놓치고 있니?
다음 스트립 - 백 코드는 내 시스템 (COM3이 연결되어 있음)의 문제점을 보여줍니다. 전체 코드는 아주 행복하게 읽기 및 쓰기 ...하지만 독자는 위에서 설명한 조건을 앓고 :
HANDLE portHandle = CreateFile("COM3",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL); // succeeds
HANDLE readerEvent = CreateEvent(0, TRUE, FALSE, _T("Rx Event")); // succeeds
char buffer[ 200 ];
DWORD bytesRead;
OVERLAPPED reader;
memset(&reader, 0, sizeof(reader));
reader.hEvent = readerEvent;
ResetEvent(readerEvent);
ReadFile(portHandle, buffer, 200, &bytesRead, &reader);
if (WaitForSingleObject(reader.hEvent, 2000) == WAIT_OBJECT_0)
{
// always true, never has to wait on the event.
}
일부 코드를 표시하십시오. –
이벤트를 수동으로 재설정 할 필요가 없습니다. 'ReadFile'은 당신을 위해 그것을합니다. [MSDN] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa365467%28v=vs.85%29.aspx) :'ReadFile은 이벤트가 시작될 때 비 신호 상태로 재설정합니다 I/O 작업. " –