在进行I / O完成端口时,是否需要在OVERLAPPED结构上设置hEvent?

时间:2011-06-02 15:07:37

标签: windows serial-port iocp io-completion-ports

我在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时在hEvent结构上设置OVERLAPPED。这有必要吗?我不关心阻止IOCP线程 - 所以我永远不会对CreateEvent(...) | 1感兴趣。

如果没有必要,可能导致问题的原因是什么? GetQueuedCompletionStatus()需要阻塞,直到数据到达串口。

那里有没有好的IOCP串口示例?我还没有找到完整的串口+ IOCP示例。他们大多数是插座。从理论上讲,它应该适用于串行端口,文件,套接字等。

1 个答案:

答案 0 :(得分:0)

我弄清楚了 - 我没有使用SetCommMask()调用EV_RXCHAR | EV_TXEMPTY,然后使用WaitCommEvent()结构调用OVERLAPPED。在我这样做之后,我的IOCP线程表现得如预期的那样。当端口上出现新角色时,GetQueuedCompletionStatus()返回。然后我可以拨打ReadFile()

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