Qt中多线程问题

1. 出现的问题

编写视频解码器程序时,把解码那部分单独置于一个线程中进行处理,后来实际应用到项目中发现内存泄漏很严重

问题就出现在多线程中,每次视频解码器程序关闭时首先必须释放其所涉及的堆空间,

由于Qt组件的堆空间一般是由其父组件直接进行管理的,但线程如果没有指定对应的父组件就必须自己手动处理;

2. 解决

直接在析构函数汇总增加如下代码

1 CameraClient::~CameraClient()
2 {
3     delete mPlayer;
4     mPlayer=NULL;
5 }
但是还是出错: 

QThread: Destroyed while thread is still running

当出现这个问题时,说明子线程还在执行,但是主线程却退出了,所以需要加入一个线程停止标识,m_stop;通知子线程你要退出下了
 
1 volatile bool m_stop;
CameraClient::~CameraClient()
{
    mPlayer->stopVideo();
    delete mPlayer;
    mPlayer=NULL;
}
void VideoPlayer::stopVideo()
{
    m_stop=true;
}
如果只是这样修改还是会报错,因为当m_stop=true;时有可能子线程还在执行,加上这句话唯一能确保的是下一次循环不执行,但此时主线程已经要退出了,子线程却还在执行
所以就要等到这个子线程这次结束后主线程退出,即需要执行子线程的wait函数subthread.wait();
完整的修改代码为:
1 CameraClient::~CameraClient()
2 {
3     mPlayer->stopVideo();
4     mPlayer->wait();
5     
6     delete mPlayer;
7     mPlayer=NULL;
8 }
原文地址:https://www.cnblogs.com/zhaobinyouth/p/9543044.html