【问题标题】:Qt seems to use lots of threadsQt 似乎使用了很多线程
【发布时间】:2016-07-07 04:01:18
【问题描述】:

我经常使用 Qt,但最近需要调试我一直在创建的线程并发现比我预期的更多的线程。

所以我的程序只是一个简单的控制台(无 GUI)Qt 应用程序(Linux)。

我创建的线程:

  • 它有一个 main()(执行 QtCoreApplication)——所以它是主线程。
  • 用于处理从 com 端口接收到的数据的线程(使用 FTDI D2XX 第三方代码驱动程序)

仅此而已。当我执行 ps -T... 并找到我的应用程序时,有 7 个线程。我有两个使用信号和插槽的 QObjects 类,所以也许它们每个都需要一个线程来处理消息,这需要我到 4 个线程......所以我不知道为什么我的应用程序可能有 7 个线程。

谁能解释更多关于发生了什么?如果需要可以发布代码。请注意,我只在代码中使用一次new QThread(目前)。

【问题讨论】:

  • 我无法想象为什么 Qt 会在没有被要求的情况下创建额外的线程,尤其是在没有 GUI 的情况下,但也许他不是罪魁祸首。尝试禁用线程的创建,也许是 FTDI 驱动程序创建了其他 3。
  • 此外,AFAIK 信号 + 用于正常事件(如按钮单击)的插槽也不需要额外的线程。它们在事件循环中处理。
  • Qt 应用程序确实会产生大量线程,尤其是 GUI 应用程序。
  • @FabioCeconello 这是真的,但给人的印象是错误的。 “正常”形容词是不必要的。没有所谓的“非正常”事件。此外,信号槽机制和事件是完全不同的两件事。
  • @VioletGiraffe 嗯,没有。好吧,Qt 不这样做,不过用户代码当然是免费的。

标签: c++ linux multithreading qt


【解决方案1】:

Qt 不会创建任何 per-QObject 线程。它出于某些特定于平台的原因创建辅助线程,例如QProcess 有时需要辅助线程。

FTDI D2XX unix 驱动程序使用 libusb 并且该实现是完全倒退的,并且在您为其提供的线程之上使用额外的线程。坦率地说,您不应该在 Linux 或 OS X 上使用 D2XX 驱动程序。只需使用内核驱动程序即可。

您应该在一个普通的非 Qt 测试应用程序中简单地运行 D2XX 驱动程序,该应用程序打开设备并连续读取它并查看它产生了多少线程。你会感到沮丧...

【讨论】:

  • 天哪,你是对的! - D2XX 自己添加了三个线程!,我真的没想到我也会在测试中隔离它。谢谢:)
  • @code_fodder 更糟糕的是:您发送到设备或从设备返回的每一位数据都通过用户态驱动程序/libusb 中的一个或两个工作线程传递。如果您经常传输缓慢的数据块,它会强制进行上下文切换并且速度非常慢。 FTDI 对此的处理方式很糟糕,而且 libusb 也不会给任何人带来任何好处。不要使用那段可悲的(censored)。
  • @code_fodder 因为我无法编辑评论:s/every bit/every chunk/ of data [...] s/slow chunks/small chunks/。我今天不能打字。
  • ... 嗯,但我理解你所有的 cmets :) ... 只是不是最后一个 s/every.... 是什么意思?另外,我已经改为使用 tty(或 VCD 内核)驱动程序......好多了:)))
  • sed 命令:s/before/after/ 表示将“之前”替换为“之后”:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
  • 2012-04-20
相关资源
最近更新 更多