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字节
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函数检索。如果未能设置超时值,可能会出现不可预测的结果。有关通信超时的更多信息,请参阅通信超时
- MAXDWORD值与ReadTotalTimeoutConstant和ReadTotalTimeOut乘数成员的零值相结合,指定读取操作将立即返回已接收的字节,即使未接收任何字节
ReadFile在事件开始I/O操作时将事件重置为非信号状态。
谢谢-也不知道该功能。