在 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 发射会发生啥?