QThread 使用技巧 注意事項


綫程密集型工作 (或相較 QTimer 對異步有更高要求的操作),可以放到 QThread 綫程實例中進行處理。

  1. 作用域

  2. QThread 初始時,處於父級作用域。

    父級調用 QThread 內非 run() 方法,仍處於父級作用域。

    QThread 內除 run() 外有事件 (包括 QTimer) 在運行,QThread::isRunning() 都返迴 true。

  3. 信號/槽

  4. 通常,QThread 可以采用 信號 連接外部對象。

    若不想丟失任何數據,可將數據放到跨類傳遞的單獨容器中 (不放在信號內傳遞)。

    綫程內若上一信號與下一信號發射間隔時間很短,接收槽可能隻收到下一信號。

    這就是采用信號/槽,解決 APP 擁堵現象的原因。

  5. 計時器

  6. 調用 QThread::startTimer(int: timing) 公共函數啓動綫程自身事件計時器,比單獨設置計時器更優。

    QThread 還可以擁有其它自定義計時器、或 超時時間 自定的延時操作。

    由其它對象實例化的自定義計時器跨 QThread 實例調用,在任務處理完後需再移迴原綫程。

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

    在 QThread::run() 函數內實例化的計時器不會工作,在 run() 函數內殺除其它對象的計時器可能導緻崩潰。

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

  7. 常見異常

  8. 采用 QThread 異步處理任務時,在 PyQt 會拋齣 TypeError 異常,而 PySide 會拋齣 RuntimeError。

    采用 QThread 類似功能異步處理任務時,會拋齣 RuntimeError。

    注意: 不推薦嵌套 QThread 綫程類實例,後續信號可能無法正常發射。

另請參閱:

QTimer 計時器類

PySide6 QThread 使用技巧

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