关于“删除线程”时出现的错误

4 篇文章 0 订阅

对于正常的删除线程,这里指软件关闭时删除线程,这里就不讨论了。

首先本文说的线程,是对一个自定义线程的再继承,比如:

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() 就可以了,实测不管我删除多频繁,软件都不会奔溃,而且不会有内存溢出。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值