pyqt5 重启相同线程错误:QThread: Destroyed while thread is still running
Published on 2020-07-09 15:19 in 分类: pyhon3 with 空水
分类: pyhon3

pyqt5 重启相同线程错误:QThread: Destroyed while thread is still running

背景:

把一个基于QObject的类的槽运行在另一个线程,我们可以用moveToThread的方法。

  1. 新建一个子线程类,编写槽函数和信号,MyClass *m_MyClass=new MyClass();
  2. 新建一个线程对象QThread *runThread=new QThread();
  3. 使用connect连接当前类与子线程的信号槽,以便触发线程及接收线程执行结果;
  4. 使用m_MyClass.moveToThread(runThread),将子线程类移到线程中执行;
  5. runThread->start(),开启线程。

以下子线程名称统称为B线程,主线程统称为A线程;

B线程是在后台不断的检测PC连接的设备,当检测到合适的设备连接成功后,A线程进行逻辑处理,此时B线程函数内部会直接return,等到A线程处理完连接设备的数据后,会再次新起一个B线程。(这里是因为A线程处理一次数据时间比较长,B线程没必要一直运行。)
: 此处之所以不用互斥量来加锁,直接让B线程阻塞是因为担心死锁,而且本身程序比较小,耗用内存和CPU什么的都非常小,重启一个B线程也不会有影响。

问题:

但是B线程函数内部会直接return并不代表线程结束(归根结底还是自己不了解如何调用),所以直接再次调用runThread.start()会报错QThread: Destroyed while thread is still running

解决方法:

再次调用runThread.start()之前添加两行:

  1. runThread.quit()
  2. runThread.wait()
posted @   空水  阅读(2799)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示