2012-11-11 37 views
0

我有一個CLI應用程序,我正在擴展它的用戶界面以幫助實現可用性,並使用Qt-4.8.3。Qt4與UI線程的接口

應用程序連接到IRC服務器,並且每個連接駐留在它自己的線程中接收數據。解析器運行在不同的線程中,然後處理數據並作出相應反應 - 創建通道,添加用戶等。

我一直在瀏覽文檔,只是無法確定(或真正看到)在我的實例中更新UI最有用的方法是什麼 - 我應該創建一個繼承自QThread的類並運行它,使用QFuture和QtConcurrent做一些技巧,創建一個自定義結構並將其傳遞給UI線程,使用customEvent(),還是有更好的方法?代碼易讀性和性能是最重要的要求。

我現在的代碼運行完美,但自然在解析器線程內創建一個新的QWidget,立即打破了它不是UI線程的通知。

只有一個類(目前,它繼承QObject並提供信號+插槽功能)用於在QApplication上運行exec,並且還包含服務器,通道,用戶的創建函數等

如果需要,我可以發佈一些代碼,但有很多,我不知道它確實是相關的。

回答

4

執行此操作的規範方法是創建QObject/QThread對(或多個QObject和單個QThread,如果您希望多個函數在同一個線程中運行)。而不是子類化QThread,您繼承QObject的子類,創建一個QThread並將您的QObject子類實例移動到該線程moveToThread()。 QThread的預期用途是作爲操作系統線程功能的接口,而不是作爲運行代碼的容器。 (見http://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation)。

所有與GUI的通信當然都是使用信號和插槽進行的。

+0

優秀的鏈接,澄清了我的測試中的一些怪異! – ZXcvbnM

0

這種情況聽起來很常見。它只是將處理過的數據從線程轉發到UI更新主線程的基本解決方案。

最簡單的方法就是使用SIGNAL/SLOT機制。您的主線程應該連接到解析器的信號。在分析器中準備好數據時,只需發送一個包含您選擇使用的數據結構的信號。數據結構只是適合您傳輸數據的需求。只是一個結構或任何你想要的。