QThread 在 PySide2 PyQt5 用戶界麵編程中,會經常用到。
注意: 采用 QThread (或類型功能) 異步處理任務,很容易齣現 RuntimeError TypeError 等異常。
在重實現的 QThread.run() 函數內調用 print() 內置函數,每次不一定輸齣提示信息。
注意:當調試源代碼時,沒有輸齣讓人很睏惑。
由於 PIL 解釋器 原因,PySide2 PyQt5 的 QThread 隻能使用一物理綫程,即使能夠采用 QThreadPool 多綫程編程技術。
解決辦法: 使用並行多進程代替多綫程,雖然編程架構要復雜不少。
注意:PySide2 QThread 的 wait() 函數有時可能阻塞其後的所有操作。
對於應用程序局部異步多綫程 (類似協程),Python 是支持的,隻是不能超齣一物理綫程。
在 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 絕對不可以。
另請參閱:
版權聲明: 本文為獨傢原創稿件,版權歸 樂數軟件 ,未經許可不得轉載。