【发布时间】:2014-04-01 00:22:36
【问题描述】:
我们有一个 DLL,它为我们制造的 USB 设备提供 API,该设备可以显示为 USB CDC com 端口。实际上,我们在 Windows 上使用自定义驱动程序以获得最佳性能以及异步 i/o,但我们过去也使用串行端口异步文件 i/o 并取得了相当大的成功。
当 API 与我们的设备通信时,延迟在此 API 中非常重要,因此我们构建了我们的库,以便当应用程序调用 API 以在设备上执行命令时,这些命令会直接转化为 API 调用者线程上的写入,因此没有等待上下文切换。该库还维护一个侦听线程,该线程始终在异步读取时使用等待对象等待新响应。这些响应被解析并插入到线程安全队列中,供 API 用户在方便时读取。
所以基本上,我们大部分的写作都是在 API 调用者的线程中完成的,而我们所有的阅读都是在一个监听线程中完成的。我已经尝试将我们的代码版本移植到使用 QSerialPort 而不是 Windows 和 OSX 的本机串行文件 i/o,但是每当我尝试从调用者的线程中写入()时,我都会遇到错误(QSerialPort 是在监听线程):
QObject: Cannot create children for a parent that is in a different thread.
这似乎是由于为 QSerialPortPrivate::startAsyncWrite() 使用的通知器池创建了另一个基于 QObject 的 WriteOverlappedCompletionNotifier。
当前 5.2 版本的 QSerialPort 是否仅限于在同一个线程上进行读取和写入?这似乎很不幸,因为底层操作系统对串行端口文件 i/o 没有任何此类线程限制。据我所知,这个问题主要与 QSerialPort 的所有通知程序类都是基于 QObject 的事实有关。
有没有人可以解决这个问题?我可能会尝试构建自己的 QSerialPort,它使用不基于 QObject 的通知器来看看这让我走多远。 QObject 唯一真正的优势似乎是在端口关闭时销毁通知器。
【问题讨论】:
-
你应该带一些代码。你确定你在监听线程中创建了 QSerialPort 吗?你的线程实现如何?
-
-1,因为该问题预设了问题的存在,而没有提供任何测量来支持它。
-
Latency is very important-> 你正在使用 QtSerialPort... 你是认真的吗?!正如我们的一位用户所说,我们的库基本上是双击频率! -
@FinalContest:我们不使用 QtSerialPort - 我们在 Windows 中使用我们自己的驱动程序和异步 i/o。当我遇到这些线程问题时,我正在为其他操作系统评估 QtSerialPort。在我们放弃之前,我们甚至都没有达到可以比较性能的地步。
标签: multithreading qt serial-port