首页 > 其他分享 >怎么结束线程不崩溃不卡顿

怎么结束线程不崩溃不卡顿

时间:2022-11-01 17:55:05浏览次数:38  
标签:结束 CollisionQueryThread 不卡顿 查询 耗时 线程 崩溃 执行

1.问题描述

Qt开发客户端程序时,因为耗时的数据库查询操作会阻塞主界面线程,所以把耗时操作放入新建的子线程中去执行,用过子线程的信号和主线程的槽函数连接,返回查询结果;这样可以避免Qt程序执行耗时操作界面卡顿的问题;

但是又有新的问题,当我执行第一次查询,查询还没有结束,再用同样的线程去执行第二次查询,如果第一次查询没有结束,第二次查询m_thread->tart();将不会执行线程run函数;第二次查询无效,还是第一次查询结果;但是使用Qthread的quit(),exit();函数,也无法立刻结束掉正在执行的第一次查询;如果执行完了quit()或exit()后,就立刻执行delete m_m_thread会造成程序崩溃,线程还在执行;只有在执行完了quit()或exit()后,执行wait();函数;但是wait();会阻塞等待线程结束,线程结束后,才能delete m_thread,或者才能执行第二次查询。

但是wait();会阻塞等待线程结束,造成主线程的卡顿无响应;还是没有解决问题。这时候想到用teminate();函数直接强杀一波,teminate();会立即结束线程,立刻返回;但是teminate();是不安全的,概率性会造成异常崩溃,如下图所示,加上try catch也无济于事;

那么如何优雅的结束掉正在执行耗时任务的线程,又不影响新的查询任务的执行呢?

 

 

2.实现方法

每次执行查询任务都创建新的线程去执行新的查询,旧的线程先判断下,如果在运行,则连接信号槽finished和deletelater函数,让它执行结束后自动销毁,不去等他了;如果没有在执行我们就立刻销毁掉;执行新的查询统一用新创建的对象去执行耗时操作;这样及避免等待上一次的执行结束,导致界面卡顿,也不会影响第二次的任务执行;

if (m_CollisionQueryThread!=NULL)
    {
        if (m_CollisionQueryThread->isRunning())
        {
            connect(m_CollisionQueryThread, &CollisionQueryThread::finished, m_CollisionQueryThread, &CollisionQueryThread::deleteLater);
            LOG_INFO("CollisionQueryThread stop0 ");
            m_CollisionQueryThread->StopTask();
            m_CollisionQueryThread->quit();
            //m_CollisionQueryThread->wait();

        }
        else
        {
            delete m_CollisionQueryThread;
            m_CollisionQueryThread = NULL;
        }
    }
    //else
    {
        m_CollisionQueryThread = new CollisionQueryThread();

 m_CollisionQueryThread->StopTask();函数的实现也很简单,就是将线程变量m_stop设置为true,当线程run函数中有循环时,可以直接return退出,这样线程可以早点结束,不用等到循环结束才会退出线程。




void CollisionQueryThread::StopTask()
{
m_stop = true;
}


void CollisionQueryThread::run()

{
     for (int i = 0; i < retList.size(); i++) { if (m_stop==true) { LOG_INFO("CollisionQueryThread stop1 "); return; } //耗时的操作········ } }
}

 

标签:结束,CollisionQueryThread,不卡顿,查询,耗时,线程,崩溃,执行
From: https://www.cnblogs.com/bclshuai/p/16848615.html

相关文章

  • Java多线程-线程关键字(二)
    Java中和线程相关的关键字就两:volatile和synchronized。volatile以前用得较少,以后会用得更少(后面解释)。它是一种非常轻量级的同步机制,它的三大特性是:1、保证可见性,即强制......
  • C语言:---gdb多线程调试
    1)恢复程序运行和单步调试当程序被停住了,你可以用continue命令恢复程序的运行直到程序结束,或下一个断点到来。也可以使用step或next命令单步跟踪程序。continue[ignore-coun......
  • 记一次 .NET 某医疗器械 程序崩溃分析
    一:背景1.讲故事前段时间有位朋友在微信上找到我,说他的程序偶发性崩溃,让我帮忙看下怎么回事,上面给的压力比较大,对于这种偶发性崩溃,比较好的办法就是利用AEDebug在程序崩溃......
  • Java多线程-线程生命周期(一)
    如果要问我Java当中最难的部分是什么?最有意思的部分是什么?最多人讨论的部分是什么?那我会毫不犹豫地说:多线程。Java多线程说它难,也不难,就是有点绕;说它简单,也不简单,需要理......
  • 线程和进程的区别与联系以及单线程多进程与单进程多线程的区别
    线程和进程概念进程(process):是指具有已一定功能的独立程序,是系统资源分配的基本单位,在内存中有其完备的数据空间和代码空间,拥有完整的虚拟空间地址。一个进程所拥有的数据和......
  • Unity3D :Mob SMSSDK 运行崩溃
    报错信息android.content.ActivityNotFoundException:Unabletofindexplicitactivityclass{com.shuiying.smsm09061/com.mob.tools.MobUIShell};haveyoudeclaredt......
  • Java实验报告--计时器(线程)
    一、实验目的了解Java线程的使用方法二、实验内容1、使用多线程制作一计时器,要求实现文本框输入一个时间(分),计时结束后提示。2、系统通过点击按钮可实现启动计时、暂停、结束......
  • 支持JDK19虚拟线程的web框架,之二:完整开发一个支持虚拟线程的quarkus应用
    欢迎访问我的GitHub这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos本篇概览本篇是《支持JDK19虚拟线程的web框架》系列的第二篇,......
  • Java多线程(7):JUC(上)
    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 前面把线程相关的生命周期、关键字、线程池(ThreadPool)、ThreadLocal、CAS、锁和AQS都讲完了,现在就剩下怎么来用多线程了......
  • main线程执行 int a=10/0; 是怎么捕获异常的
    首先看一个例子inta=10/0;控制台输出:Exceptioninthread"main"java.lang.ArithmeticException:/byzero atthreadpool.ThreadPoolTest.main(ThreadPoolTest.ja......