我在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例子。他们大多数是插座。从理论上讲,它应该串行端口,文件,插座等
我意识到这是一个很老的帖子。我想知道你是否可以发布一个例子。我有IOCP为套接字工作,并且我为串行端口使用了相同的IOCP特定类。我无法完成它的工作。传输是好的,但我似乎无法得到接收事件的工作。我尝试了ReadFile(),SetCommMask()和WaitCommEvent()的组合(以及不同的顺序),但是我一直没有弄清楚它的正确性。 – Ken 2017-12-10 00:27:51