我是Qt(PySide)for python的新手,正在寻找良好的QThread使用。
我有一个工作线程和工作者对象,后者在构造后被移动到工作线程中。
class Foo:
def __init__(self):
self.barThread = QThread()
self.barWorker = barWorker()
self.barWorker.moveToThread(self.barThread)
我的问题是,在转移到新主题后,当barThread结束时barWorker是否被销毁?
因为我更喜欢这样做(阻止以线程不安全的方式访问对象),但是尽管传递给新线程,但工作者似乎是垃圾回收。
class Foo:
def __init__(self):
self.barThread = QThread()
def startWork(self):
barWorker = BarWorker()
barWorker.moveToThread(self.barThread)
感谢。
答案 0 :(得分:4)
线程不会获取移动到它的对象的所有权,因此它也不承担删除它们的责任。所有发生的事情都是对象的线程亲和力发生了变化。工作者对象的清理完全是调用者的责任。
在C ++中,您可以使用new
创建工作线程对象,然后将线程的finished()
信号连接到工作线程的deleteLater()
插槽。但这在Python中不会真正起作用,因为没有指针。一种可能的解决方法是使用功能盒来维护临时引用,而不是:
def startWork(self):
worker = Worker()
worker.moveToThread(self.thread)
worker.finished.connect(self.thread.quit)
self.thread.started.connect(worker.process)
def cleanup():
self.thread.started.disconnect(worker.process)
self.thread.finished.disconnect(cleanup)
worker.deleteLater()
self.thread.finished.connect(cleanup)
self.thread.start()