子线程启动 关闭不卡顿(子线程创建和结束的完整代码)

本文详细介绍了如何在PyQt5中使用QThread创建一个Worker子线程,避免UI操作被阻塞,展示了从创建线程到接收结果的完整过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

子线程创建和结束的完整代码

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import time


# 该 Worker 类实现了乘法运算
class Worker(QObject):
    # 定义一个信号
    on_result = pyqtSignal(float)

    def __init__(self, a, b):
        super().__init__()
        self.a = a
        self.b = b

    def run(self):
        print("开始处理(预计2秒)")

        # 模拟原本会导致UI阻塞的阻塞语句
        time.sleep(8)
        result = self.a * self.b

        # 发射信号
        self.on_result.emit(result)


class Window(QWidget):
    def __init__(self):
        super().__init__()

        l = QVBoxLayout(self)

        button = QPushButton("run")
        button.clicked.connect(self.on_button_clicked)
        l.addWidget(button)

    def on_button_clicked(self):
        # 创建 Worker 对象
        self.worker = Worker(7, 8)

        # 创建线程
        thread = QThread(self)
        self.worker.moveToThread(thread)
        self.worker.on_result.connect(self.on_worker_done)
        
        # 线程完成后退出
        self.worker.on_result.connect(lambda: thread.quit())
        
        # 启动线程
        thread.started.connect(self.worker.run)
        thread.start()

    def on_worker_done(self, value: float):
        print("我得到啦!", value)


if __name__ == "__main__":
    app = QApplication([])

    w = Window()
    w.show()

    app.exec_()

关键字:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值