2016-01-20 87 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 –