Qt多线程,安全退出线程

问题产生: 

      使用Qt创建项目过程中,发现项目窗口退出时,资源没有正常释放,后台仍然在运行。经过排查,是创建的线程没有安全释放,在网上搜索了一些方式,记录一下正常安全释放的方式。

安全释放方式:

背景:

定义了一个DateUpdate类,用于实现线程中时间显示,该类继承QObject。

class DateUpdate : public QObject
{
    Q_OBJECT
public:
    ....

public slots:
    void Start();
    void Stop();
signals:
    void updateDate(QString date, QString time);
    void finish();

};
void DateUpdate::Start()
{
    while(is_running){
        QThread::sleep(1);
        emit updateDate(QDateTime::currentDateTime().toString("yyyy/MM/dd"),
                        QDateTime::currentDateTime().toString("hh:mm:ss"));
    }
}

void DateUpdate::Stop()
{
    is_running = false;
    emit finish();
}

采用MovetoThread的方式,创建线程:

dateUpdate = DateUpdate::getInstance();
update_date_thread = new QThread();
dateUpdate->moveToThread(update_date_thread);
void MainWindow::start_Work()
{
    update_date_thread->start();
    emit onStart();
}

void MainWindow::stop_Work()
{
    emit onStop();
}

      创建连接,如下代码,基本逻辑为,主界面发送onStop()消息,dateUpdate接收后,发送finished信号到主界面,主界面对dateUpdate对象进行deleteLater销毁释放。检测dateUpdate对象正常destoryed,update_date_thread线程quit退出,等待线程正常退出,触发finished事件后,对线程进行销毁delete Later。

connect(dateUpdate, &DateUpdate::finish, dateUpdate, &DateUpdate::deleteLater);
connect(dateUpdate, &DateUpdate::destroyed, update_date_thread, &QThread::quit);
connect(update_date_thread, &QThread::finished, update_date_thread, &QThread::deleteLater);

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值