【问题标题】:Do QThreads control destruction of stack-created QObjects pushed to it?QThreads 是否控制堆栈创建的 QObjects 的销毁?
【发布时间】:2015-05-25 15:52:49
【问题描述】:

我是 Python 的 Qt (PySide) 新手,正在研究如何使用 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)

谢谢。

【问题讨论】:

    标签: python multithreading qt pyqt pyside


    【解决方案1】:

    线程不拥有移动到它的对象的所有权,因此它也不承担删除它们的责任。所发生的只是对象的线程亲和性发生了变化。清理工作对象完全是调用者的责任。

    在 C++ 中,您可以使用 new 创建 worker 对象,然后将线程的 finished() 信号连接到 worker 的 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()
    

    【讨论】:

    • 非常有趣的选项,没想到。所以这将迫使它不被GC'ed?我想知道大多数人是否只是将其保留为成员变量并使用线程安全函数(连接、断开连接等)。感谢您的帮助。
    • @jabz。是的,我不认为我的解决方案特别常见 - 我只是想满足您的规范。通常,我只会使用内部属性来保留引用。
    猜你喜欢
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 2011-01-13
    相关资源
    最近更新 更多