【发布时间】:2014-05-30 13:59:56
【问题描述】:
我对 Qt 中的线程和事件循环感到困惑。
QThread 通常在 run() 中运行 exec()。但是当你覆盖run()时,就不会有事件循环了。
This (older) doc 声明在没有事件循环的线程中创建的对象上调用 deleteLater() 不起作用:
如果没有事件循环正在运行,则不会将事件传递给对象。 例如,如果您在线程中创建了一个 QTimer 对象但从不调用 exec(),QTimer 永远不会发出它的 timeout() 信号。打电话 deleteLater() 也不起作用。 (这些限制适用于主要 线程也是如此。)
不过,看看下面的代码:
class MyObject : public QObject
{
Q_OBJECT
QString content;
public:
MyObject(QObject *parent = 0);
~MyObject();
};
class MyThread : public QThread
{
Q_OBJECT
public:
explicit MyThread(QObject *parent = 0);
void run();
signals:
public slots:
};
MyObject::MyObject(QObject *parent) :
QObject(parent),
content("foobar")
{}
MyObject::~MyObject()
{
// This code is still executed before I close the program. How?
qDebug() << "Destroying MyObject";
}
MyThread::MyThread(QObject *parent) :
QThread(parent)
{}
void MyThread::run()
{
// Creating a heap object in a thread that does not have
// an event loop (because I reimplemented run()).
MyObject * objectification = new MyObject();
sleep(1);
objectification->deleteLater();
}
那么为什么deletelater() 调用仍然会发布一个被拾取的事件?
【问题讨论】: