1

我在 Windows 上使用 I/O 完成端口进行串行端口通信(我们可能会大量使用串行端口)。我已经完成了通常的操作,创建了 IOCP,启动了 I/O 线程,并将我的CreateFile()句柄与 IOCP 相关联(CreateFile()用 调用FILE_FLAG_OVERLAPPED)。这一切都很好。我已将COMMTIMEOUTSall 设置为 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 示例。它们中的大多数是用于套接字的。理论上,它应该适用于串口、文件、套接字等。

4

1 回答 1

0

我想通了——我没有用结构调用SetCommMask()EV_RXCHAR | EV_TXEMPTY然后WaitCommEvent()OVERLAPPED结构调用。在我这样做之后,我的 IOCP 线程按预期运行。GetQueuedCompletionStatus()当港口出现新角色时返回。然后我可以打电话ReadFile()

所以回答原来的问题:“不,你不需要为带有串口的IOCP设置hEvent。”

于 2011-06-03T05:48:58.370 回答