QThread 使用技巧 常見問題 注意事項


QThread 在 PySide2 PyQt5 用戶界麵編程中,會經常用到。

注意: 采用 QThread (或類型功能) 異步處理任務,很容易齣現 RuntimeError TypeError 等異常。

print 輸齣


在重實現的 QThread.run() 函數內調用 print() 內置函數,每次不一定輸齣提示信息。

注意:當調試源代碼時,沒有輸齣讓人很睏惑。

多綫程 vs 多進程


由於 PIL 解釋器 原因,PySide2 PyQt5 的 QThread 隻能使用一物理綫程,即使能夠采用 QThreadPool 多綫程編程技術。

解決辦法: 使用並行多進程代替多綫程,雖然編程架構要復雜不少。

注意:PySide2 QThread 的 wait() 函數有時可能阻塞其後的所有操作。

對於應用程序局部異步多綫程 (類似協程),Python 是支持的,隻是不能超齣一物理綫程。

QtGui QtWidgets


在 QThread 實例中可以調用 QtGui QtWidgets 實例,但在其中可能不能對其進行修改。

否則,會齣現錯誤提示、異常中斷、應用程序變得不穩定、描繪更新異常、自動崩潰、等現象。

解決辦法: 在 QThread 實例 run() 函數中修改 QtGui QtWidgets 實例參數,再用信號把計算所得參數連接到 QThread 外 QtGui QtWidgets 實例槽進行更新。

如下所示:

QObject: Cannot create children for a parent that is in a different thread.
(Parent is QListView(0x8307d10), parent's thread is QThread(0x280b7c0), current thread is threadTest(0x8739a10)
QBasicTimer::start: Timers cannot be started from another thread
					

界麵相關


界麵消息提示、界麵刷新不要放到 QThread 內,否則無法正常使用,且還可能導緻崩潰。

當然,更不可能進行交互操作。

計時器


QThread 實例自帶一計時器,其它自定義計時器不能跨綫程。

關閉計時器要注意對應綫程關係,否則操作無效且會提示齣錯 (或導緻崩潰)。

自定義計時器跨綫程運行,計時有時會被綫程打亂 (可將計時器重新移迴原綫程以解決此問題)。

PyQt5 對 QThread 內計時器要求不嚴格,譬如在 run() 函數可以殺除其它對象的計時器,而 PySide2 絕對不可以。

另請參閱:

QtCore::QTimer 計時器類

版權聲明: 本文為獨傢原創稿件,版權歸 樂數軟件 ,未經許可不得轉載。