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 使用技巧

版权声明: 本文为独家原创稿件,版权归 乐数软件 ,未经许可不得转载。