Qt线程QThread开启和安全退出

本文介绍了如何在Qt中创建一个继承自QObject的类,将耗时逻辑放入槽函数,通过QThread在新线程执行。强调了正确处理线程生命周期、内存管理以及信号槽连接的重要性,包括使用moveToThread、deleteLater和QThread的start()与quit()方法。
摘要由CSDN通过智能技术生成
  • 写一个继承QObject的类,对需要进行复杂耗时逻辑的入口函数声明为槽函数
  • 此类在旧线程new出来,不能给它设置任何父对象
  • 同时声明一个QThread对象,在官方例子里,QThread并没有new出来,这样在析构时就需要调用- – QThread::wait(),如果是堆分配的话, 可以通过deleteLater来让线程自杀
  • 把obj通过moveToThread方法转移到新线程中,此时object已经是在线程中了
  • 把线程的finished信号和object的deleteLater槽连接,这个信号槽必须连接,否则会内存泄漏
  • 正常连接其他信号和槽(在连接信号槽之前调用moveToThread,不需要处理connect的第五个参数,否则就显示声明用Qt::QueuedConnection来连接)
  • 初始化完后调用’QThread::start()'来启动线程
  • 在逻辑结束后,调用QThread::quit退出线程的事件循环https://www.cnblogs.com/billbyte/p/14184865.html
  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在PyQt5中使用QThread创建线程时,确保线程安全性非常重要。如果线程安全,可能会导致资源争用、竞争条件和死锁。 要实现线程安全退出,需要在代码中实现以下几个步骤: 1. 创建一个类,该类继承自QObject和QThread,并重写run()方法。 2. 添加一个信号,当线程退出时发出,该信号作为通知主线程的指示器。 3. 在run()方法中,添加一个while循环,检查一个布尔值,该值表示程序是否应该继续运行。如果此布尔值为False,则跳出循环,结束线程。 4. 在mainwindow的析构函数中,将该布尔值设置为False,并通过emitsignal()方法发送信号,通知线程停止。 例如,以下是一个简单的例子,可以在主线程和PyQt5 QThread线程之间创建一种安全退出: ``` from PyQt5.QtCore import Qt, QThread, pyqtSignal, QObject class Worker(QThread): exitThread = pyqtSignal() def __init__(self, parent=None): super(Worker, self).__init__(parent) def run(self): while True: if not self.isRunning(): return #线程执行代码 def stop(self): self.exitThread.emit() class MainWindow(QWidget): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.workerThread = Worker() self.workerThread.exitThread.connect(self.stopThread) self.workerThread.start() def stopThread(self): self.workerThread.terminate() ``` 在上面的代码中,如果从mainwindow发送emit信号,emit将调用worker stop,从而启动信号退出方法exitThread,从而终止QThread中的运行。这将确保一个线程安全退出的模式,防止资源泄漏或竞争条件。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值