【问题标题】:QObject deleteLater after QThread quitQThread退出后QObject deleteLater
【发布时间】:2023-02-05 01:47:57
【问题描述】:

我想设计一个基类,用于通过 qobject::connect 或 invokemethod 控制线程并在线程本身中执行类的槽。

调用 start 时,我调用 this->movetothread(memthread) 和 memthread->start 将其移动到成员线程的上下文中并启动事件循环。 当调用stop时,调用qthread的quit来停止事件循环。问题是,当线程退出时,以后不可能通过 deletelater 释放“this”,因为 deletelater 需要一个正在运行的事件循环来删除对象。对象的线程上下文可能已经通过调用 quit 之前停止了。

我无法将 object->deletelater 连接到 thread::finished,因为那时对象将无法使用,而且我无法再次启动/停止线程。我在设计中的目标是实际实现这一点。能够停止线程,稍后启动,再次停止等等。

我不确定设计是否可以像 qt 那样可行,但至少想尝试一下。

附言我的第一个问题,请让我知道任何错误。

【问题讨论】:

    标签: qt


    【解决方案1】:

    我不确定我是否完全理解这个问题,而且细节也很少。但是,为什么首先要停止线程呢?无论如何,根据具体上下文,您可以在要删除对象时启动线程然后删除它,然后停止线程并删除 QThread。否则你可以简单地删除你的对象。另一个选择是在停止线程时将对象移动到主线程:

    QMetaObject::invokeMethod(this, [this] {
        moveToThread(qApp->thread());
    });
    

    然后当你觉得你准备好了就简单地 deleteLater() 。这是两个选项,但我认为还有其他选项,这取决于您的情况。

    【讨论】: