PyQt QThread:线程仍在运行时被销毁

2024-09-30 00:24:18 发布

您现在位置:Python中文网/ 问答频道 /正文

尽管将对QThread的引用保存为self.lightsThread,但停止QObjectself.lightsWorker,然后再次启动self.lightsThread导致了错误

QThread: Destroyed while thread is still running

停止self.lightsWorker之后,QThreadself.lightsThread也必须停止吗?如果没有,问题是什么?在

^{pr2}$

Tags: selfis错误threadrunningwhilestillqthread
2条回答

根据答案https://stackoverflow.com/a/32138213/7742341在停止lightWorker之后,您应该退出线程并等待它停止

def stopLightsThread(self):
    print('stop lightsThread')
    self.lightsWorker.stop()
    self.lightsThread.quit()
    self.lightsThread.wait()
在C++中我不得不面对同样的问题,但问题是一样的。在

问题是,当关联的线程仍在运行时,QThread实例被删除。这可能非常危险,因为线程代码的执行被中断,而不能保证线程已准备好被删除。在

例如:

  • 线程控制对象(工作线程)的执行和生存时间
  • 在这个对象析构函数中释放了一个resource(显式或隐式,就像使用QObject父/子系统时一样)
  • 由于线程执行被中断,因此不会删除该对象

它会导致内存泄漏和资源泄漏。在

在代码中,工作线程停止,但工作线程不停止。我不是python专家,但您的worker对象似乎已停止但没有删除。在

要正确停止工作线程,您应该:

  • 给你的员工发个信息告诉他“停止工作”
  • 请求线程退出:它将向线程发送一条“退出”消息,该消息将在工作线程执行后被处理
  • 等待你的线程停止

最后一步是可选的:如果线程和工作线程没有与其他对象共享资源,您可能不需要等待它们完成,只需忘掉它们。在

唯一的执行方法是在退出应用程序之前应该正确停止所有线程:在应用程序退出之前,您应该等待所有当前正在运行的线程停止。在

对于简单的任务,您还应该考虑使用QtConcurrent框架。在

相关问题 更多 >

    热门问题