在 Qt 中,当线程结束时对象会发生啥?

Posted

技术标签:

【中文标题】在 Qt 中,当线程结束时对象会发生啥?【英文标题】: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 移动到该线程,然后再重复一遍吗?

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

请注意,与前一个线程的连接仍然存在,除非您销毁线程或手动断开连接。 当我将Engine 移动到另一个线程时,(再次)出现“无法移动到目标线程”的错误。我应该以某种方式断开Engine 与上一个线程的连接吗?

以上是关于在 Qt 中,当线程结束时对象会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C多线程,当一个对象在其方法被执行时被释放会发生啥? (以及如何预防?)

调用具有条件变量等待的线程对象的析构函数时会发生啥?

当一个线程试图访问一个互斥锁资源时会发生啥?

如果目标对象死亡,Qt::BlockingQueuedConnection 发射会发生啥?

c++ 当在一个线程中写入并在第二个线程中读取同一个对象时会发生啥? (它安全吗?)[重复]

如果某些线程比其他线程先结束会发生啥?