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