2016-01-20 55 views
0

我已经使用过很多Qt,但最近需要调试我一直在创建的线程,然后发现了更多的线程,然后我期待着。所以我的程序只是一个简单的控制台(没有GUI)Qt应用程序(linux)。我创建Qt似乎使用了很多线程

主题:

  • 它有一个main()(执行该QtCoreApplication) - 所以这是主线程。
  • 线程以处理从com端口(使用FTDI D2XX第三方代码驱动器)

接收到的数据,这是所有。当我做ps -T ...并找到我的应用程序时,有7个线程。我有两个类是使用信号和插槽的QObject,所以也许他们需要一个线程来处理消息,这需要我4线程...所以我不知道为什么我可能有7个线程为我的应用程序。

任何人都可以解释更多关于发生了什么?如果需要可以发布代码。注意我只在代码中使用了new QThread(目前)。

+1

我无法想象为什么Qt会创建额外的线程,而不会被要求,特别是没有GUI,但也许他不是罪魁祸首。尝试禁用线程的创建,也许FTDI驱动创建了其他3. –

+1

AFAIK信号+按钮点击等普通事件的插槽不需要额外的线程。它们在事件循环中处理。 –

+0

Qt应用程序会产生整个lotta线程,特别是GUI应用程序。 –

回答

4

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

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

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

+0

omg,你是对的! - D2XX自己添加了三个线程!我真的没有想到,除此之外,我还会在测试中将其隔离。谢谢:) –

+0

@code_fodder更糟糕的是:您发送到设备或从设备取回的每一点数据都会通过userland驱动程序/ libusb中的一个或两个工作线程传递。它强制上下文切换,并且如果您经常传输缓慢的数据块,它会非常慢。 FTDI对此的处理方式非常糟糕,而且libusb也没有做任何好处。不要使用那个可怜的(*审查*)。 –

+0

那么...清除了这一点,非常感谢:) +1 –