• 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 }
  • 相关阅读:
    MongoDB 安装及其配置
    hdu 1241 Oil Deposits
    2014ACM/ICPC亚洲区北京站
    hdu 5901 count prime & code vs 3223 素数密度
    hdu 2191 珍惜现在,感恩生活
    FOJ 2181 快来买肉松饼
    hdu 5384 Danganronpa
    hdu 2222 Keywords Search
    hdu 1300 Pearls
    2016.2.24. 《构建之法》开始阅读
  • 原文地址:https://www.cnblogs.com/zhaobinyouth/p/9543044.html
Copyright © 2020-2023  润新知