问题描述
#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 的析构函数? 谢谢!
解决方法
- 线程不会因为run()函数被销毁 事实上,当父(主)循环时调用 deleteLater() 函数 夺回控制权。
- 从 main() 创建 ChildThread,QThread::msleep() 调用 将控制权交还给主循环,因此析构函数可以 调用。