我在 Windows 上使用 I/O 完成端口进行串行端口通信(我们可能会大量使用串行端口)。我已经完成了通常的操作,创建了 IOCP,启动了 I/O 线程,并将我的CreateFile()
句柄与 IOCP 相关联(CreateFile()
用 调用FILE_FLAG_OVERLAPPED
)。这一切都很好。我已将COMMTIMEOUTS
all 设置为 0,除了ReadIntervalTimeout
设置为MAXDWORD
完全异步。
在我的 I/O 线程中,我注意到GetQueuedCompletionStatus()
无限期地阻塞。我正在使用INFINITE
超时。因此,我在将ReadFile()
句柄与 IOCP 关联后立即拨打电话。现在GetQueuedCompletionStatus()
由于某种原因导致立即释放,传输了 0 个字节,但没有错误(它返回 true,GetLastError() 报告 0)。如果它无事可做,我显然希望它阻止。如果我ReadFile()
在 GetQueuedCompletionStatus() 之后放置另一个,那么池中的另一个线程将在传输 0 字节且没有错误的情况下拾取它。
在我看到和遵循的示例中,我没有看到任何人在使用 IOCP 时设置hEvent
结构OVERLAPPED
。那有必要吗?我不在乎阻塞 IOCP 线程——所以我永远不会对CreateEvent(...) | 1
.
如果没有必要,可能导致问题的原因是什么?GetQueuedCompletionStatus()
需要阻塞,直到数据到达串行端口。
有没有好的 IOCP 串口示例?我还没有找到完整的串行端口+ IOCP 示例。它们中的大多数是用于套接字的。理论上,它应该适用于串口、文件、套接字等。