QT程序退出还占进程

news2024/11/15 0:01:23

问题情况

程序运行时的样子:
在这里插入图片描述
程序退出时的样子:
其跑到了后台进程里面:
程序退出了,但在任务管理器里查看,其从进程里面转移到后台进程了。
这种问题,怎么办,代码里,应该释放的也都释放了,为什么会出这个问题呢?
在后台的进程,还有时占些cpu,说明的确在运行,的确在做事情。
这首先怀疑到了是否线程的问题呢?

问题分析

1、线程析构了吗?

窗体的析构函数:

MainWindow::~MainWindow()
{
    if(nullptr != m_pCmdThread)
    {
        m_pCmdThread->deleteLater();
        delete m_pCmdThread;
    }

线程的析构函数:

CmdThread::~CmdThread()
{
    quit();
    wait();
}

看着都正常,问题出在那呢?
可能是quit(),wait()

quit()
告诉线程的事件循环以return 0(成功)退出。 相当于调用QThread :: exit(0)。如果线程没有事件循环,这个函数什么也不做。
wait()
阻塞线程,直到满足以下任一条件:
与此QThread对象关联的线程已经完成执行(即从run()返回)。 如果线程完成,该函数将返回true。 如果线程尚未启动,它也返回true。
时间毫秒已经过去了。 如果时间是ULONG_MAX(默认值),那么等待永远不会超时(线程必须从run()返回)。 如果等待超时,此函数将返回false。

这里非常关键的解释是quit(),quit(),不是线程退出,而是线程的事件循环退出,如果是继承的QThread,那么,自己实现了run方法,里面也没调用exec()方法,则这一个线程没有事件循环,这一点必须清楚。
没有事件循环,那么run方法的死循环就退不出来,我的代码是这样写的:

void CmdThread::run()
{
    qDebug("enter function CmdThread::run");
    m_pCmdService = new CmdService();
    QString strMessage;
    while(true)
    {
        switch (this->m_currentState)
        {
        case INIT_PORT:
        case OPEN_PORT:
            if(!m_pCmdService->openPort(*this->m_pBoardInfoDomain))
            {
                strMessage = QString::asprintf("串口%s连接失败", this->m_pBoardInfoDomain->serialName.c_str());
                emit sendMessage(1, strMessage);
                return;
            }

显然,是没有事件循环的,那这样,线程还是在一 直运行的,那么这种情况如何解决,方法很多,目的就是退出这一个while循环就可以了,其实也可以这样说,没有一个合适的方法退出正在运行的线程,如果强制退出,那样是危险的。
为了正式一些,就用官方推荐的方法如下:

void CmdThread::run()
{
    qDebug("enter function CmdThread::run");
    m_pCmdService = new CmdService();
    QString strMessage;
    while(true)
    {
     if(QThread::currentThread()->isInterruptionRequested())
        {
            break;
        }
        switch (this->m_currentState)
        {
        case INIT_PORT:
        case OPEN_PORT:
            if(!m_pCmdService->openPort(*this->m_pBoardInfoDomain))
            {
                strMessage = QString::asprintf("串口%s连接失败", this->m_pBoardInfoDomain->serialName.c_str());
                emit sendMessage(1, strMessage);
                return;
            }

触发的事件如下:

CmdThread::~CmdThread()
{
    requestInterruption();
    quit();
    wait();
}

就是在析构的时候停止线程。
这样,再测试发现,关闭窗体后,后台进程不会再存在了,这样就解决了这一个问题,这一个问题的关键点在于:
1、对quit,exit函数的理解,其是退出线程事件,不会退出线程的run方法
2、线程的退出,只能我自己写代码实现,没有其它的办法,在析构函数里退出就是一个很好的方法。
如果一个应该停止的任务在此线程上运行,则返回true。 requestInterruption()可以请求中断。
这个功能可以用来使长时间运行的任务干净地中断。 建议在耗时长的运行函数中定期执行此操作。 注意不要太频繁地调用,以保持较低的开销。
最后,以一张图来说明情况:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/411046.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序引入广告位功能,详细步骤!!!

大家碰到过首页加载时一开始出现的广告页面,这种微信官方提供了一个api进行设置,下面我们来详细解释一下。 首先第一步需要小程序累计用户数达到1000即可开通流量主,成功开通流量主之后就可以创建相应的广告位了,包括banner广告、…

【设计模式】如何在业务开发中使用适配器模式?

文章目录前言适配器模式定义通用代码实现适用场景案例场景分析一坨坨代码实现适配器模式重构总结前言 适配器模式(Adapter Pattern):将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个…

Can‘‘t connect to MySQL server on localhost (10061)解决方法

首先检查MySQL 服务没有启动》如果没有启动,则要启动这个服务。 有时候安装mysql后使用mysql命令时报错 Cant connect to MySQL server on localhost (10061),或者用net start mysql 时报服务名无效,一般是因为mysql服务没有启动。 打开 powe…

itop-3568开发板驱动学习笔记(18)tasklet 机制

《【北京迅为】itop-3568开发板驱动开发指南.pdf》 学习笔记 文章目录tasklet 简介tasklet 结构体tasklet 初始化使能 tasklet失能 tasklettasklet 调度函数tasklet 取消调度函数tasklet 实验tasklet 简介 Tasklets 机制是linux中断处理机制中的软中断延迟机制。在linux中存在着…

【ES】搜索结果处理RestClient查询文档

【ES】搜索结果处理&RestClient查询文档2.搜索结果处理2.1.排序2.1.1.普通字段排序2.1.2.地理坐标排序2.2.分页2.2.1.基本的分页2.2.2.深度分页问题2.2.3.小结2.3.高亮2.3.1.高亮原理2.3.2.实现高亮2.4.总结3.RestClient查询文档3.1.快速入门3.1.1.发起查询请求3.1.2.解析响…

【计算机图形学】图形变换(平移变换、比例变换、旋转变换、对称变换、错切变换、复合变换)

一 实验目的 编写图形各种变换的算法二 实验内容 1:自行设计基本图案,完成1-5种简单变换 实验结果如下图所示: 图形初始化: 第一次点击左键,实现平移变换: 第二次点击左键,实现比例变换&…

Android 性能优化——APP启动优化详解

1.1 为什么要启动优化? 用户希望应用能够及时响应并快速加载,启动时间过长的应用不能满足这个期望,并且可能使用户失望。 启动太慢的结果: 体验效果差用户放弃使用你的应用时间越长用户流失越高产品死掉 1.2 启动优化流程及分…

HDLBits-Modules 题解【Verilog模块例化】(中文翻译+英文原文,可顺带学习英文)

Moudule 概念介绍 到目前为止,你已经熟悉了一个模块,它是一个通过输入和输出端口与其外部交互的电路。更大、更复杂的电路是通过将较小的模块和其他连接在一起的部分(例如赋值语句和always块)组合而成的更大模块来构建的。因为模…

从零开始学OpenCV——图像灰度变换详解(线性与非线性变换)

文章目录图像灰度变化灰度变换介绍灰度线性变换灰度分段线性变换图像点运算灰度非线性变换线性点运算灰度的非线性变换:对数变换灰度的非线性变换:伽马变换灰度的非线性变换:对比拉伸灰度的非线性变换: S形灰度变换灰度的非线性变…

tomcat中出现RFC7230和RFC3986问题解析

问题截图 问题分析 出现上述问题,是因为各版本tomcat中对特殊字符和请求路径中携带中文参数而产生的错误提示。 解决办法 1、调整tomcat版本 tomcat 7.0.76之前的版本不会出现类似问题 2、tomcat9之前,修改tomcat目录底下的/conf/catalina.properti…

233:vue+openlayers绘制渐变填充色的圆形、多边形

第233个 点击查看专栏目录 本示例的目的是介绍如何在vue+openlayer中绘制带有渐变填充色的圆形、多边形。这里用canvas的方式去渲染,用到了DEVICE_PIXEL_RATIO,设备上的物理像素与设备无关像素 (dips) 之间的比率 (window.devicePixelRatio)。 直接复制下面的 vue+openlayer…

用ChatGPT创建一个REST API

ChatGPT是OpenAI公司开发的大型语言模型。在本文中,主要探讨如何使用ChatGPT在C#中创建REST API。 一、简介 ChatGPT是由人工智能研究中心OpenAI创建的尖端自然语言处理模型,OpenAI公司是由埃隆马斯克、萨姆奥特曼和格雷格布罗克曼共同创办的。该模型于…

360浏览器+Adobe Acrobat DC实现在线预览PDF大样校对

甲方:实现方正PDF文字大样校对,校对后在360浏览器中新开一个页面在线预览PDF文字大样校对结果。 我方实现过程: 1.方案选择 方案零:使用浏览器自带的PDF阅览器,经测试360极速模型,谷歌等软件能预览但是标记的PDF内容…

【笔记】大模型,大资料

大模型,大资料,loss会降低,准确率会增加 1大模型 1.1模型的顿悟时刻 举了一个一知半解的例子 1.2 模型 chain of thought 模型足够大时才会有比较好的作用 calibration 检测模型对于答案的confidence 会出现 “u-shape” 2.大资料 文法…

系统复杂度之【高可用】

接着,我们聊聊复杂度的第二个要求高可用。 参考维基百科,先来看看高可用的定义。 系统无中断地执行其功能的能力,代表系统的可用性程度,是进行系统设计时的准则之一。 这个定义的关键在于“ 无中断”,但恰好难点也在“…

Java 并发编程面试题——Future

目录1.什么是 Future 模式?Java 中是如何实现的?2.Callable、Future 与 FutureTask 分别是什么?2.1.Callable 接口2.2.Future 接口2.3.FutureTask 类3.CompletableFuture 类有什么用?1.什么是 Future 模式?Java 中是如…

windows系统管理_Windows server 2016 组管理与授权

组账户的概述 在 windows 服务器中,当我们需要为多个用户设置相同的权限时,一个一个的逐一设置会比较 麻烦,这个时候我们就需要用到另一种模式,组账户,使用此账户来进行简化操作。 在以后的职场中,每家公司…

Flink 优化 (五) --------- Job 优化

目录一、使用 DataGen 造数据1. DataStream 的 DataGenerator2. SQL 的 DataGenerator二、算子指定 UUID三、链路延迟测量四、开启对象重用五、细粒度滑动窗口优化一、使用 DataGen 造数据 开发完 Flink 作业,压测的方式很简单,先在 kafka 中积压数据&a…

全景图像畸变校正

1.简介 理想的相机基本上是小孔成像的,在小孔成像模型中,如果焦距一定,那么图像传感器像素平面的面积直接决定了相机视场角的大小,超过这个视场角范围的物体不会被镜头获取到。因此基于透镜成像原理的相机,视场角无法…

JAVA解析XML时的内存消耗问题

问题出现 最近一个项目中,有个需求功能是从外部传入的XML读取数据,然后写入到数据库中。 写完之后,有在本地电脑上的Tomcat跑了一下,正常读取到XML中的数据,并整理好后,插入了数据库保存了。但是线上运行的…