C++ Assynchronous serial comms:ReadFile()为什么在重叠结构中设置事件?

C++ Assynchronous serial comms:ReadFile()为什么在重叠结构中设置事件?,c++,visual-studio,winapi,C++,Visual Studio,Winapi,我利用了各种源代码,将一些(多线程)代码拼凑在一起,以便从串行端口读写。一切都很好。。。除了从串行端口读取数据的线程中的循环无意中执行繁忙等待之外。本质上,反复发生的是: 重置事件(在读取循环外部创建),并将其句柄用作重叠结构中的hEvent成员 ReadFile()传递重叠结构(以及其他参数),并立即返回 WaitForSingleObject()等待重叠结构中的事件,但总是立即返回,因为事件总是在ReadFile()之后设置 然后,向GetOverlappedResult()传递相同的重叠

我利用了各种源代码,将一些(多线程)代码拼凑在一起,以便从串行端口读写。一切都很好。。。除了从串行端口读取数据的线程中的循环无意中执行繁忙等待之外。本质上,反复发生的是:

  • 重置事件(在读取循环外部创建),并将其句柄用作重叠结构中的hEvent成员
  • ReadFile()传递重叠结构(以及其他参数),并立即返回
  • WaitForSingleObject()等待重叠结构中的事件,但总是立即返回,因为事件总是在ReadFile()之后设置
  • 然后,向GetOverlappedResult()传递相同的重叠结构,并成功返回,但通常只读取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函数的文档包含以下段落:

  • 从通信设备读取时,ReadFile的行为由设置的当前通信超时确定,并使用SetCommTimeout和GetCommTimeout函数检索。如果未能设置超时值,可能会出现不可预测的结果。有关通信超时的更多信息,请参阅通信超时
我根本没有使用SetCommTimeouts()。执行GetCommTimeouts()并检查结果表明端口设置与COMMTIMEOUTS文档中本段所述的值相同:

  • MAXDWORD值与ReadTotalTimeoutConstant和ReadTotalTimeOut乘数成员的零值相结合,指定读取操作将立即返回已接收的字节,即使未接收任何字节

您还可以使用该功能等待具有特定事件掩码的事件。使用CreateFile和WaitCommEvent:的代码示例。

请显示一些代码。您不需要手动重置事件<代码>读取文件为您执行此操作。From:
ReadFile在事件开始I/O操作时将事件重置为非信号状态。
谢谢-也不知道该功能。