在其他 QThread 中创建的 QThread 不调用析构函数

问题描述

我有一个代码

#include <QApplication>
#include <QThread>
#include <QDebug>

class ChildThread : public QThread {
Q_OBJECT
public:
ChildThread() {
    connect(this,&QThread::finished,this,&ChildThread::deleteLater);
}
~ChildThread() {
    qDebug() << "~TR()";
}
protected:
 void run() {
    qDebug() << "RUN";
}

};

class ParentThread : public QThread {
Q_OBJECT
public:
protected:
void run() {
    for (int i = 0; i < 10; i++) {
        ChildThread *t = new ChildThread();
        t->start();
        msleep(1000);
    }
 }
};

int main(int argc,char *argv[])
{
QApplication a(argc,argv);
ParentThread *t = new ParentThread();
t->start();
for (int i = 0; i < 10; i++) {
    ChildThread *t = new ChildThread();
    t->start();
    QThread::msleep(1000);
}
return a.exec();

}

而且我不明白,为什么在到达 run() 函数结束后在 ParentThread 中创建的所有 ChildThread 没有结束并且没有调用 ChildThread 的析构函数,但是如果我在 ParentThread 之外创建 ChildThread,则调用 ChildThread 的析构函数? 谢谢!

解决方法

  1. 线程不会因为run()函数被销毁 事实上,当父(主)循环时调用 deleteLater() 函数 夺回控制权。
  2. 从 main() 创建 ChildThread,QThread::msleep() 调用 将控制权交还给主循环,因此析构函数可以 调用。