QThreads是否控制了推送到它的堆栈创建的QObject的破坏?

时间:2015-03-22 16:40:16

标签: python multithreading qt pyqt pyside

我是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)

感谢。

1 个答案:

答案 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()