如何正确使用 QThread

简述

要实现一个线程很简单,写一个函数,绑定一些数据。如果有必要的话,可以使用 mutex 或者其他方法来保证和线程的安全交互。

在 Qt 中,使用线程有几种不同的方式,下面主要演示 QThread + QObject(worker),此方式主要用于涉及事件驱动的编程和跨线程的信号/槽。

| 版权声明:一去、二三里,未经博主允许不得转载。

worker-object

在使用 worker-object 时,最主要的事情是要记住 QThread 不是一个线程,而是一个线程对象的包装器。这个包装器提供了信号、槽和方法,来轻松地使用 Qt 中的线程对象。

具体的使用,分为以下几步:

  • 准备一个 QObject 子类,其中包含了所有需要的功能。
  • 创建一个 QThread 实例,使用 QObject::moveToThread(QThread*) 将 QObject 对象移动至线程中。
  • 设置适当的信号/槽连接,以保证正常退出。
  • 调用 QThread::start() 启动线程

声明 Worker 类

来实现一个简单的 Worker 类:

class Worker : public QObject {
    Q_OBJECT

public:
    Worker();
    ~Worker();

PyQt5关于QThread线程阻塞以及UI界面假死的问题

09-22

python中qthread多线程终止任务的问题

05-24
任务WORK在thread里面运行后,如果想停止任务(而不是简单终止线程),用线程安全的方式用槽信号来触发任务停止条件时,不起作用,因为线程内需要等任务(dowork)自然完成后,才会接收其他槽信号队列。如果直接用跨线程的方式执行实例self.work.stop,反而能够立即停止任务。只是隐约感觉这种方式不太正规,请问有没有其他方式? ``` class Work(QObject): update_process = pyqtSignal(int) update_completed = pyqtSignal() .....ini_thing.... def dowork(self): self.var = 0 while self.var < 10 and self._running == True self.var += 1 self.update_process.emit(self.var) self.update_completed.emit() # -----------任务结束 def stopwork(self): self._running = false class UiTest(QDialog): .....UI-thing.... self.work = Work() self.thread = QThread() self.work.moveToThread(self.thread) self.thread.started.connect(self.work.dowork) self.work.update_process.connect(self.currentStep.setValue) self.worker.update_completed.connect(lambda:print('work finished')) self.btnDoWork.clicked.connect(self.work.dowork) 1. self.btnStopWork.clicked.connect(self.work.stopwork)[/color] -- 通过槽触发任务 2. self.btnStopWork.clicked.connect(self.stopwork)[/color] -- 直接跨线程介入任务 self.btnStopThread.clicked.connect(self.stop_thread) self.btnStartThread.clicked.connect(self.start_thread) self.thread.finished.connect(lambda: print('thread finished')) def start_thread(self): self.thread.start() def stop_thread(self): self.thread.quit() self.thread.wait() ** def stop_work(self): -------------直接跨线程介入任务 self.work.stopwork** 。。。。APP Thing。。。。。。。 ```
©️2020 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客 返回首页
实付39.90元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值