线程密集型工作 (或相较 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。
Note: 不推荐嵌套 QThread 线程类实例,后续信号可能无法正常发射。
See also:
Copyright Notice: This article is exclusive original manuscripts, copyrighted by Happy Digits Software , shall not be reproduced without permission.