在Qt中,当一个线程结束时,对象会发生什么?

3

我有一个简单的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个回答

3
当线程结束后,引擎会发生什么?
与对象的移动到线程无关。当您“移动”时,您并没有真正地移动它,您只是告诉它在线程上执行一些代码。对象将像往常一样被销毁(超出范围或者堆分配的内存中使用delete)。
我可以创建另一个线程并将引擎移动到该线程中,然后再次重复所有操作吗?
是的,只要对象仍然存在。

1
请注意,在不销毁线程或手动断开连接的情况下,与先前线程的连接仍然存在。 - Nikos C.
1
当我将 Engine 移动到另一个线程时,(再次)会出现错误提示“无法移动到目标线程”。我应该如何从之前的线程中断开 Engine - Henricus V.
@HenricusV。你需要从当前 Engine 所在的线程中调用 moveToThread 方法。第一次时,它仍在主线程中,所以不会出现任何错误。第二次需要将其从当前所在的 thread 中移动。请参见 moveToThread 文档中本节底部的警告。另外,阅读 线程亲和性 也会很有用。 - Punitto Moe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接