2024-09-30 00:24:18 发布
网友
尽管将对QThread的引用保存为self.lightsThread,但停止QObjectself.lightsWorker,然后再次启动self.lightsThread导致了错误
QThread
self.lightsThread
QObject
self.lightsWorker
QThread: Destroyed while thread is still running
停止self.lightsWorker之后,QThreadself.lightsThread也必须停止吗?如果没有,问题是什么?在
根据答案https://stackoverflow.com/a/32138213/7742341在停止lightWorker之后,您应该退出线程并等待它停止
lightWorker
def stopLightsThread(self): print('stop lightsThread') self.lightsWorker.stop() self.lightsThread.quit() self.lightsThread.wait()
问题是,当关联的线程仍在运行时,QThread实例被删除。这可能非常危险,因为线程代码的执行被中断,而不能保证线程已准备好被删除。在
例如:
它会导致内存泄漏和资源泄漏。在
在代码中,工作线程停止,但工作线程不停止。我不是python专家,但您的worker对象似乎已停止但没有删除。在
要正确停止工作线程,您应该:
最后一步是可选的:如果线程和工作线程没有与其他对象共享资源,您可能不需要等待它们完成,只需忘掉它们。在
唯一的执行方法是在退出应用程序之前应该正确停止所有线程:在应用程序退出之前,您应该等待所有当前正在运行的线程停止。在
对于简单的任务,您还应该考虑使用QtConcurrent框架。在
根据答案https://stackoverflow.com/a/32138213/7742341在停止
lightWorker
之后,您应该退出线程并等待它停止问题是,当关联的线程仍在运行时,QThread实例被删除。这可能非常危险,因为线程代码的执行被中断,而不能保证线程已准备好被删除。在
例如:
它会导致内存泄漏和资源泄漏。在
在代码中,工作线程停止,但工作线程不停止。我不是python专家,但您的worker对象似乎已停止但没有删除。在
要正确停止工作线程,您应该:
最后一步是可选的:如果线程和工作线程没有与其他对象共享资源,您可能不需要等待它们完成,只需忘掉它们。在
唯一的执行方法是在退出应用程序之前应该正确停止所有线程:在应用程序退出之前,您应该等待所有当前正在运行的线程停止。在
对于简单的任务,您还应该考虑使用QtConcurrent框架。在
相关问题 更多 >
编程相关推荐