PySide6多线程-QThread

Pyside6 多线程有三种方法:计时器模块 QTimer、多线程模块 QThread、事件处理。这里我们介绍QThread用法。

QThread

QThread Qt 所有线程控制的基础,每个 QThread 实例代表一个线程。

QThread 有两种使用方式,即子类化实例化。

  • 子类化需要重写run()函数并在该函数中执行多线程操作;

  • 实例化需要通过 QObject.moveToThread(targetThread:QThread) 函数接管多线程类

1. 子类化

【后续补充】

2. 实例化(推荐)

在 PySide6 中,QThreadmoveToThread 的用法与 Qt 框架中的使用方法基本相同。QThread 是 PySide6 中的线程类,而 moveToThread 是将一个对象移动到特定线程的方法。
以下是在 PySide6 中使用 QThreadmoveToThread 的详细步骤:

1. 导入必要的模块:

在 Python 脚本的开头,导入需要的 PySide6 模块:

from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton
from PySide6.QtCore import QThread, Slot, Signal
import sys

2. 创建自定义对象:

首先,创建你想要移动到线程的自定义对象。这个对象应该继承自 QObject,并包含你想要在另一个线程中执行的方法。

from PySide6.QtCore import QObject, QEventLoop

class Worker(QObject):
    def __init__(self):
        super().__init__()

    def do_work(self):
        # 在这里执行你的耗时任务
        loop = QEventLoop()
        loop.exec_()

3. 创建线程:

然后,创建一个 QThread 对象,代表你要在其中执行任务的目标线程。

thread = QThread()

4. 创建自定义对象实例:

实例化刚刚创建的自定义对象。

worker = Worker()

5. 将对象移动到线程:

使用 moveToThread 方法将对象移动到目标线程。

worker.moveToThread(thread)

6. 连接线程的启动信号:

确保在目标线程启动时,你的对象也会启动。可以使用连接(connect)机制来完成这一点。

thread.started.connect(worker.do_work)

7. 启动线程:

最后,启动目标线程。

thread.start()

完整的示例代码如下:

from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton
from PySide6.QtCore import QThread, Slot, Signal, QEventLoop
import sys

class Worker(QObject):
    def __init__(self):
        super().__init__()

    def do_work(self):
        # 在这里执行你的耗时任务
        loop = QEventLoop()
        loop.exec_()

app = QApplication(sys.argv)

# 创建线程
thread = QThread()

# 创建要移动的对象
worker = Worker()

# 将对象移动到线程
worker.moveToThread(thread)

# 连接线程的启动信号
thread.started.connect(worker.do_work)

# 链接线程结束的信号
thread.finished.connect(worker.quit)
thread.finished.connect(worker.deleteLater)

# 启动线程
thread.start()

sys.exit(app.exec_())

这样,Worker 对象的 do_work 方法将在 thread 线程中执行。这样做可以避免在主线程中执行耗时的操作,使得主线程保持响应性。请确保在完成任务后正确地退出线程,并释放资源。

通过 finished 信号连接到 QObject.deleteLater() 函数来释放刚刚结束的线程中的对象。如果要终止线程,则可以使用函数 exit()quit() 。强制结束的话可以使用 terminate() 函数来终止正在运行的线程,同时要确保在 terminate() 函数之后使用 wait() 函数。

信号描述
started在开始执行 run() 函数之前,从相关线程发射此信号
finished党程序完成业务逻辑时,从相关线程发射此信号
  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YumOS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值