【发布时间】:2013-11-22 14:27:40
【问题描述】:
我正在向现有代码库添加对 FTDI 驱动程序的支持,该代码库使用重叠 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?我知道这使用线程池,这会在系统繁忙的情况下增加延迟吗? (我可以将自己的线程设置为高优先级,但我对线程池的优先级一无所知)。
编辑:如果我在 RegisterWaitForSingleObject 中使用 WT_EXECUTEINWAITTHREAD 标志,这个“服务员线程”是什么线程,它有什么优先级?
【问题讨论】:
-
我在这方面没有任何经验,所以我不会回答这个问题,但是如果您将 bAlertable 参数设置为 true,那么从文档中 WaitforSingleObjectEx 应该可以工作。 msdn.microsoft.com/en-us/library/windows/desktop/…
-
感谢您的评论。这对我不起作用,因为我不仅通过 IOCompletionPort 接收来自等待线程的重叠 IO 结果,还接收来自其他线程的自定义消息和完成结果,并且文档状态“等待函数返回并且仅当 bAlertable 为时才调用完成例程TRUE,调用线程是发起读写操作的线程。”
-
好吧,为了降低延迟,我会选择您最不喜欢的选项 - 等待事件的高优先级专用线程。但是,如果现有代码具有与您的新要求相同的延迟限制,并且目前符合规范,我会按照您的建议首先尝试 RegisterWaitForSingleObject 和 PostQueuedCompletionStatus。
-
这些选择并不重要。当然 WFSO 具有更少的延迟,RWFSO 使您成为操作系统上的好公民,但获取 I/O 完成线程并不是免费的。次要细节,真正重要的是当你的程序因为你的代码被换出而无法响应数百毫秒时会发生什么。或者视频或音频驱动程序运行优先级始终高于您的优先级的内核线程。如果由于缓冲区溢出导致失败,那么您的系统非常不可靠。
-
@Hans Passant 谢谢你加强了我的直觉。延迟要求是由于愚蠢的嵌入式硬件需要 2 毫秒内的 ACK 或响应。如果它没有及时得到这个响应,这个词就不会结束,但我确实收到一条错误消息,需要通过慢速串行端口重新启动很多东西,这会使一切运行得更慢。所以如果它偶尔发生也没关系,我只是希望它尽可能少发生。
标签: c++ multithreading winapi