QT5线程关闭

摘要:
QT5线程关闭QThread析构函数的说明:请注意,删除QThread对象不会停止其管理的线程的执行。QThread类quit()告诉线程事件循环以return0(成功)退出。Wait()将阻塞线程,直到满足以下任何条件:与此QThread对象关联的线程已完成执行。如果线程尚未启动,它也会返回true。槽函数在接收器的线程中执行。阻塞队列非阻塞队列(UniqueConnectionGUI接口在GUI程序中暂停处理,主线程也称为GUI线程,因为它是唯一允许执行GUI相关操作的线程。

QT5线程关闭

QThread析构函数的说明:
请注意,删除一个QThread对象不会停止它管理的线程的执行。 删除正在运行的QThread(即isFinished()返回false)将导致程序崩溃。 在删除QThread之前等待finished()信号。

从Qt4.8起,可以释放运行刚刚结束的线程对象,通过连接finished()信号到QObject::deleteLater()。

QThread类

quit()

告诉线程的事件循环以return 0(成功)退出。 相当于调用QThread :: exit(0)。如果线程没有事件循环,这个函数什么也不做。

wait()

阻塞线程,直到满足以下任一条件:
与此QThread对象关联的线程已经完成执行(即从run()返回)。 如果线程完成,该函数将返回true。 如果线程尚未启动,它也返回true。
时间毫秒已经过去了。 如果时间是ULONG_MAX(默认值),那么等待永远不会超时(线程必须从run()返回)。 如果等待超时,此函数将返回false。  

QMutex类

在QMutex的使用中,我们关注以下4个方法和2个属性:

1、QMutex ()//构造1个mutex  默认构造参数为非递归
2、lock ()//锁
3、tryLock ()//尝试着锁
4、unlock ()//释放锁

另外两个属性是:递归和非递归。如果这个mutex是递归的话,表明它可以被一个线程锁多次,也就是锁和解锁中再嵌套锁和解锁;非递归的话,就表明mutex只能被锁一次。

QMutexLocker类

相当于QMutex的简化,提供了简化了的互斥上的操作(也即简化了的加锁和解锁)。

使用详情可看帮助文档;

关闭线程

一.QMutex互斥锁 + bool成员变量。quit(),wait();

//线程处理函数
public:
    void dis()
    {
        QMutex mutex;
        while(1)
        {
            mutex.lock();
            if(mtread.stop) break;
            mutex.unlock();
           //实际运行代码
           //.....
        }
    }
//关闭线程函数
    mtread.stop = true;
    QThread->quit();
    QThread->wait();

以上还是存在mutex.unlock();没被调用的情况,可用QMutexLocker类优化

二.Qt5.2以后添加的新方法:requestInterruption() + isInterruptionRequested()

isInterruptionRequested()

如果一个应该停止的任务在此线程上运行,则返回true。 requestInterruption()可以请求中断。
这个功能可以用来使长时间运行的任务干净地中断。 建议在耗时长的运行函数中定期执行此操作。 注意不要太频繁地调用,以保持较低的开销。

//线程处理函数
public:
    void dis()
    {
        while(QThread::currentThread()->isInterruptionRequested())
        {
           
            //实际运行代码
            //.....
        }
    }

//关闭线程函数
    QThread->requestInterruption();
    QThread->quit();
    QThread->wait();
isInterruptionRequested() 往往配合QThread::currentThread()返回一个指向使用本函数线程的指针

关于connect第五个参数,连接类型: 1)自动连接(AutoConnection),默认的连接方式,如果信号与槽,也就是发送者与接受者在同一线程,等同于直接连接;如果发送者与接受者处在不同线程,等同于队列连接。 2)直接连接(DirectConnection),当信号发射时,槽函数立即直接调用。无论槽函数所属对象在哪个线程,槽函数总在发送者所在线程执行。
3)队列连接(QueuedConnection),当控制权回到接受者所在线程的事件循环时,槽函数被调用。槽函数在接受者所在线程执行。
  • 阻塞队列(BlockingQueuedConnection)
  • 非阻塞队列(UniqueConnection

GUI界面假死的处理
在GUI程序中,主线程也叫GUI线程,因为它是唯一被允许执行GUI相关操作的线程。对于一些耗时的操作,如果放在主线程中,就是出现界面无法响应的问题。这种问题的解决一种方式是,把这些耗时操作放到次线程中,还有一种比较简单的方法:在处理耗时操作中频繁调用QApplication::processEvents()。这个函数告诉Qt去处理那些还没有被处理的各类事件,然后再把控制权返还给调用者。

    QElapsedTimer et;  
    et.start();  
    while(et.elapsed()<300)  
        QCoreApplication::processEvents();  

 

 

 

 

 

免责声明:文章转载自《QT5线程关闭》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇IDEA中比较实用的几款插件各大浏览器保存密码的文件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

锁和监视器之间的区别 – Java并发

在面试中你可能遇到过这样的问题:锁(lock)和监视器(monitor)有什么区别? 嗯,要回答这个问题,你必须深入理解Java的多线程底层是如何工作的。 简短的答案是,锁为实现监视器提供必要的支持。详细答案如下。 锁(lock) 逻辑上锁是对象内存堆中头部的一部分数据。JVM中的每个对象都有一个锁(或互斥锁),任何程序都可以使用它来协调对对象的多线程访问...

自定义线程池实现

线程池的特点: 1,迅速响应. 2,线程之间无优先级. 3,线程执行时间短,不阻塞其他任务. 4,线程不可绑定操作,不可被跟踪. 优点: 1,对象线程不用重复的创建与销毁,节省时间,资源. 2,可以对线程的数量进行控制. 案例 线程池类: 1 importjava.util.LinkedList; 2 3 public class ThreadPool...

C#细说多线程(下)

本文主要从线程的基础用法,CLR线程池当中工作者线程与I/O线程的开发,并行操作PLINQ等多个方面介绍多线程的开发。 其中委托的BeginInvoke方法以及回调函数最为常用。而 I/O线程可能容易遭到大家的忽略,其实在开发多线程系统,更应该多留意I/O线程的操作。特别是在ASP.NET开发当中,可能更多人只会留意在客户端使用Ajax或者在服务器端使用U...

解决关闭窗口,C#报错"在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke"

情况:在C#开发的过程中多线程委托是经常用的,今天在测试以前写的软件的时候发现有个问题,报 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。 这样的错误。 解决方法:加上 if (this.IsHandleCreated) 1、首先分析问题,句柄:是对象的引用名,存于栈区(可以理解为对象的指针),对象是存于堆区,通过操控栈区...

ios开发网络学习六:设置队列请求与RunLoop

#import "ViewController.h" @interface ViewController ()<NSURLConnectionDataDelegate> @end @implementationViewController -(void)touchesBegan:(NSSet<UITouch *> *)tou...

Linux-pthread如何设置线程的优先级

设置线程优先级的函数: int pthread_setschedparam(pthread_t target_thread, int policy, const struct sched_param *param) 它主要用于设置线程的调用策略和优先级。 参数说明: 1.  target_thread是使用pthread_create所获得的线程ID。  ...