我正在向现有代码库添加对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标志,这个“服务员线程”是什么线程,它具有什么优先级?
答案 0 :(得分:0)
IOCP不是可等待的对象,因此您无法直接将其用于任何等待函数。你可以做的是通过CreateEvent()
创建一个单独的可等待事件,然后有一个单独的线程调用GetQueuedCompletionStatus/Ex()
,并在IOCP数据包到达时发出信号。