【问题标题】:In Qt, what happens to an object when a thread finishes?在 Qt 中,当线程结束时对象会发生什么?
【发布时间】:2016-03-26 18:56:18
【问题描述】:

我有一个简单的QObject

class Engine : public QObject
{
    Q_OBJECT
public:
    explicit Engine(QObject* parent = 0);
signals:
    void finished();
public slots:
    void start();
};

实例Engine* engine 存储在主窗口类中。当按下按钮时,会发生以下情况:

QThread* thread = new QThread;
engine->moveToThread(thread);
connect(engine, SIGNAL(error(QString)), this, SLOT(errorString(QString)));
connect(thread, SIGNAL(started()), engine, SLOT(start()));
connect(engine, SIGNAL(finished()), thread, SLOT(quit()));
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
thread->start();

我的问题是,在thread 完成后,engine 会发生什么?我可以创建另一个线程并将engine 移动到该线程,然后再重复一遍吗?

【问题讨论】:

    标签: c++ multithreading qt qthread


    【解决方案1】:

    线程结束后引擎会发生什么?

    对象发生的事情与它被移动到线程无关。当您“移动”时,您并没有真正移动,您只是告诉在线程上执行一些代码。该对象将像往常一样被销毁(超出范围或删除分配的堆)。

    我可以创建另一个线程并将引擎移动到该线程,然后重复 一切都回来了吗?

    是的,只要对象仍然存在。

    【讨论】:

    • 请注意,与前一个线程的连接仍然存在,除非您销毁线程或手动断开连接。
    • 当我将Engine 移动到另一个线程时,(再次)出现“无法移动到目标线程”的错误。我应该以某种方式断开Engine 与上一个线程的连接吗?
    猜你喜欢
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 2023-04-08
    • 2017-02-14
    • 1970-01-01
    • 2021-10-01
    • 2013-06-09
    • 1970-01-01
    相关资源
    最近更新 更多