綫程密集型工作 (或相較 QTimer 對異步有更高要求的操作),可以放到 QThread 綫程實例中進行處理。
QThread 初始時,處於父級作用域。
父級調用 QThread 內非 run() 方法,仍處於父級作用域。
QThread 內除 run() 外有事件 (包括 QTimer) 在運行,QThread::isRunning() 都返迴 true。
通常,QThread 可以采用 信號 連接外部對象。
若不想丟失任何數據,可將數據放到跨類傳遞的單獨容器中 (不放在信號內傳遞)。
綫程內若上一信號與下一信號發射間隔時間很短,接收槽可能隻收到下一信號。
這就是采用信號/槽,解決 APP 擁堵現象的原因。
調用 QThread::startTimer(int: timing) 公共函數啓動綫程自身事件計時器,比單獨設置計時器更優。
QThread 還可以擁有其它自定義計時器、或 超時時間 自定的延時操作。
由其它對象實例化的自定義計時器跨 QThread 實例調用,在任務處理完後需再移迴原綫程。
自定義計時器跨綫程運行,計時有時會被綫程打亂 (可將計時器重新移迴原綫程以解決此問題)。
在 QThread::run() 函數內實例化的計時器不會工作,在 run() 函數內殺除其它對象的計時器可能導緻崩潰。
PyQt5 對 QThread 內計時器要求不嚴格,譬如在 run() 函數可以殺除其它對象的計時器,而 PySide2 絕對不可以。
采用 QThread 異步處理任務時,在 PyQt 會拋齣 TypeError 異常,而 PySide 會拋齣 RuntimeError。
采用 QThread 類似功能異步處理任務時,會拋齣 RuntimeError。
注意: 不推薦嵌套 QThread 綫程類實例,後續信號可能無法正常發射。
另請參閱:
版權聲明: 本文為獨傢原創稿件,版權歸 樂數軟件 ,未經許可不得轉載。