2011-06-02 29 views
1

我在Windows上使用I/O完成端口进行串行端口通信(我们可能会有大量的串行端口使用)。我完成了通常的操作,创建IOCP,启动I/O线程,并将我的CreateFile()句柄与IOCP(CreateFile()FILE_FLAG_OVERLAPPED一起调用)关联起来。这一切工作正常。我已将COMMTIMEOUTS设置为0,除了ReadIntervalTimeout设置为MAXDWORD以完全异步。执行I/O完成端口时是否需要在OVERLAPPED结构上设置hEvent?

在我的I/O线程中,我已经注意到GetQueuedCompletionStatus()无限期阻塞。我正在使用INFINITE超时。因此,在将我的句柄与IOCP关联后,我立即拨打ReadFile()。现在由于某种原因导致GetQueuedCompletionStatus()立即释放,传输0字节,但没有错误(它返回true,GetLastError()报告0)。如果没有什么可以做的话,我显然希望它阻止。如果我在GetQueuedCompletionStatus()之后放置另一个ReadFile(),则池中的另一个线程将会传输0个字节并且没有错误。

在我看到并遵循的例子中,当使用IOCP时,我没有看到任何人在OVERLAPPED结构上设置hEvent。这是必要的吗?我不在乎永远阻止IOCP线程 - 所以我永远不会对CreateEvent(...) | 1感兴趣。

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

有没有什么好的IOCP串口的例子呢?我还没有找到完整的串口+ IOCP例子。他们大多数是插座。从理论上讲,它应该串行端口,文件,插座等

回答

0

工作,我理解了它 - 我不叫SetCommMask()EV_RXCHAR | EV_TXEMPTY然后WaitCommEvent()OVERLAPPED结构。我这样做后,我的IOCP线程表现如预期。当端口上出现新字符时返回GetQueuedCompletionStatus()。然后我可以拨打ReadFile()

所以要回答最初的问题:“不,你不需要为带串口的IOCP设置事件。”

+0

我意识到这是一个很老的帖子。我想知道你是否可以发布一个例子。我有IOCP为套接字工作,并且我为串行端口使用了相同的IOCP特定类。我无法完成它的工作。传输是好的,但我似乎无法得到接收事件的工作。我尝试了ReadFile(),SetCommMask()和WaitCommEvent()的组合(以及不同的顺序),但是我一直没有弄清楚它的正确性。 – Ken 2017-12-10 00:27:51

相关问题