使用moveToThread时的内存释放以及注意事项

news/2024/11/17 0:30:10/

在Qt中,使用线程主要有两种方式。

1、自定义线程类,继承自QThread,并重写run方法即可。该方法就不再阐述了。

2、就是推荐使用的方法。

示例代码如下:

1、自定义Worker类,将线程中的逻辑在该类中以槽函数的方式实现:

Worker.h

#ifndef WORKER_H
#define WORKER_H#include <QObject>class Worker : public QObject
{Q_OBJECT
public:explicit Worker(QObject *parent = nullptr);~Worker();public slots:void doSomething();
};#endif // WORKER_H

Worker.cpp

#include "worker.h"
#include <QDebug>Worker::Worker(QObject *parent) : QObject(parent)
{}Worker::~Worker()
{qDebug()<<"free worker...";
}void Worker::doSomething()
{qDebug()<<"do something...";
}

2、调用处的代码

    QThread *thread = new QThread;Worker* worker = new Worker;connect(thread,SIGNAL(started()),worker,SLOT(doSomething()));connect(thread,SIGNAL(finished()),worker,SLOT(deleteLater()));connect(thread,SIGNAL(finished()),thread,SLOT(deleteLater()));worker->moveToThread(thread);thread->start();

以上代码非常清晰易懂,在线程开始的时候触发Worker的doSomething槽函数,当线程结束的时候调用Worker的deleteLater槽函数以释放new出来的worker对象和thread对象。

但是问题出现了!thread线程永远不会结束!其原因是虽然worker对象的doSomething槽函数结束了,但是thread线程依然处于自己的事件循环中!也就导致了thread和worker的内存泄漏!

正确的处理办法:在worker对象的槽函数doSomething结束的时候,应发射结束信号来间接控制线程!具体代码如下:

Worker.h

#ifndef WORKER_H
#define WORKER_H#include <QObject>class Worker : public QObject
{Q_OBJECT
public:explicit Worker(QObject *parent = nullptr);~Worker();
signals:void finished();//完成信号public slots:void doSomething();
};#endif // WORKER_H

Worker.cpp

#include "worker.h"
#include <QDebug>Worker::Worker(QObject *parent) : QObject(parent)
{}Worker::~Worker()
{qDebug()<<"free worker...";
}void Worker::doSomething()
{qDebug()<<"do something...";emit finished();
}

调用处代码:

    QThread *thread = new QThread;Worker*worker = new Worker;connect(worker,SIGNAL(finished()),thread,SLOT(quit()));//新增connect(thread,SIGNAL(started()),worker,SLOT(doSomething()));connect(thread,SIGNAL(finished()),worker,SLOT(deleteLater()));connect(thread,SIGNAL(finished()),thread,SLOT(deleteLater()));worker->moveToThread(thread);thread->start();

这样就可以保证,在worker对象结束任务时,thread也退出了事件循环并发射finished信号且释放内存!


http://www.ppmy.cn/news/272070.html

相关文章

内存的申请和释放

一直一来我都浅显的认为指针是一个地址&#xff0c;指向了一块内存区域&#xff0c;但是最近突然想到几个问题&#xff1a; 1 malloc申请内存的时候传入和内存的大小参数&#xff0c;但是调用free释放内存的时候并没有传入内存快的大小&#xff0c;操作系统是如何知道要释放多…

内存的申请与释放

首先我们有两个问题 malloc()申请1G的内存能否成功&#xff1f;判断依据是什么&#xff1f;申请了一块空间没有free,进程就结束了&#xff0c;那么空间被回收了吗&#xff1f; 我们写一段代码来申请1G空间试一试 #include<stdio.h> #include<stdlib.h> #include…

如何释放linux的内存

你们知道怎么释放linux的内存吗不知道的话跟着学习啦小编一起来学习怎么释放linux的内存。 释放linux的内存的步骤 Linux下操作频繁时&#xff0c;物理内存会被快速用完&#xff0c;当操作结束后&#xff0c;物理内存没有被正常的释放&#xff0c;而一直当作caching&#xff…

AI实战营第二期 笔记5——MMPretrain代码课

文章目录 摘要MMPreTrain实战安装推理 OR 使用API数据集训练与测试微调 摘要 MMPretrain 是一个全新升级的预训练开源算法框架&#xff0c;旨在提供各种强大的预训练主干网络&#xff0c; 并支持了不同的预训练策略。MMPretrain 源自著名的开源项目 MMClassification 和 MMSel…

qemu+buildroot+linux arm64虚拟化-宿主系统wsl2

文章目录 1.qemu2.buildroot配置编译 3.linux kernel下载交叉编译工具链 linux kernel 5.16配置内核config_kernel.shbuild_kernel.sh 4.启动虚拟机start_qemu.sh参数解释运行 环境&#xff1a; wls2、qemu8.2、buildroot、linuxkernel 1.qemu https://buildroot.org/download…

如何去掉WindTerm 的锁屏,在线求助

如何去掉WindTerm)2.1.0的锁屏 按住enter就行了

联想电脑管家 锁屏壁纸目录

联想电脑管家很多壁纸很漂亮&#xff0c;想保存又不知道在哪个文件夹下&#xff0c;终于找到&#xff0c;小记一下C:\ProgramData\Lenovo\devicecenter\LockScreen\cache\

公司电脑策略强制自动锁屏解决方案

解决域控制器策略强制电脑锁屏问题 chrome安装 Keep Computer Awake插件