QThreads控制被推送到它的stackcreatedqobjects的销毁吗?

2024-04-25 00:42:42 发布

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

我对Qt(PySide)for python还不熟悉,正在研究QThread的良好用法。你知道吗

我有一个worker线程和worker对象,后者在构造之后被移动到worker线程中。你知道吗

class Foo:

def __init__(self):
    self.barThread = QThread()
    self.barWorker = barWorker()

    self.barWorker.moveToThread(self.barThread)

我的问题是,在移动到新线程之后,barThread结束时barWorker是否被销毁?你知道吗

因为我更喜欢这样做(防止以线程不安全的方式访问对象),但是尽管被传递到新线程,worker看起来还是被垃圾收集的。你知道吗

class Foo:

def __init__(self):
    self.barThread = QThread()

def startWork(self):
    barWorker = BarWorker()
    barWorker.moveToThread(self.barThread)

谢谢。你知道吗


Tags: 对象selfforfooinitdefqt线程
1条回答
网友
1楼 · 发布于 2024-04-25 00:42:42

线程不拥有移动到它的对象的所有权,因此它也不承担删除它们的责任。所发生的一切就是改变了对象的线程关联性。清除辅助对象完全由调用方负责。你知道吗

在C++中,可以创建具有{{CD1>}的工作对象,然后将线程的{{< CD2>}信号连接到工作人员的^ {< CD3>}槽。但这在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()

相关问题 更多 >