我可以在事件上使用WaitForMultipleObjects并且IOCompletionPort是否有输入?

时间:2013-11-22 14:27:41

标签: c++ multithreading winapi

我正在向现有代码库添加对FTDI驱动程序的支持,该代码库使用Overlapped IO和IOCompletionPort与串行端口和管道进行通信。我想直接与FTD2xx.dll接口,而不是使用虚拟COM端口功能(http://www.ftdichip.com/Support/Documents/ProgramGuides/D2XX_Programmer%27s_Guide%28FT_000071%29.pdf)。 问题是,据我所知,FTD2xx.dll模拟重叠IO但与IOCompletionPort不兼容。但是,无论何时在驱动器内部状态中发生任何变化,都可以传入一个事件。我正在更新的程序具有非常低的吞吐量,但需要极低的延迟(与嵌入式系统的实时通信)。

所以我的问题是如何等待事件发出信号或者IOCompletionPort不为空?最好不要使用任何其他线程。

或者我可以将RegisterWaitForSingleObject与回调一起使用,该回调将客户消息发布到IOCompletionPort吗?我理解这会使用线程池,这会在系统繁忙的情况下增加延迟吗? (我可以将自己的thredas设置为高优先级,但我对线程池的优先级一无所知)。

编辑:如果我在RegisterWaitForSingleObject中使用WT_EXECUTEINWAITTHREAD标志,这个“服务员线程”是什么线程,它具有什么优先级?

1 个答案:

答案 0 :(得分:0)

IOCP不是可等待的对象,因此您无法直接将其用于任何等待函数。你可以做的是通过CreateEvent()创建一个单独的可等待事件,然后有一个单独的线程调用GetQueuedCompletionStatus/Ex(),并在IOCP数据包到达时发出信号。