对于正常的删除线程,这里指软件关闭时删除线程,这里就不讨论了。
首先本文说的线程,是对一个自定义线程的再继承,比如:
Mythread::MyThread(QObject *parent)
:QThread(parent)
{
stop = false;
}
Mythread::run()
{
while(!stop){
}
}
MyObject::MyObject(QObject *parent)
:MyThread(parent)
{
}
在频繁的创建、删除线程(因为软件需要)时出现的软件奔溃,具体原因还不清楚,调试的情况如下:
1. (创建一个线程)
2. QThread(0x990ec0) # is running
3.(删除一个线程,同时创建一个线程)
4. QThread(0x990ec0) # is running
5. QThread(0x990ec0) # is stop
6. (删除一个线程,此时软件奔溃,因为该线程已经停止)
这里给出一种解决办法: 重载deleteLater
首先重载MyThread的deleteLater
<span style="font-family: Arial, Helvetica, sans-serif;">void MyThread::deleteLater() // public slots</span>
{
// 设置停止条件
stop = true; // 这里还需要考虑原子操作,保护stop变量,此处简单处理了
}
然后重载MyObject的deleterLater
void MyObject::deleterLater() // public slots
{
MyThread::deleterLater;
connect(this,SIGNAL(finished()),this,SLOT(deleteSelf()));
}
void MyObject::deleteSelf() // private slots
{
QObject::deleteLater();
}
这样,当你要删除MyObject时,调用MyObject.deleteLater() 就可以了,实测不管我删除多频繁,软件都不会奔溃,而且不会有内存溢出。