Qt 多线程之QThreadPool(qt多线程movetothread)

yumo66610小时前技术文章2

上述的方法需要手动建立线程,如果并发线程数量较多,而且每个线程只执行较短的任务就结束,这样就会导致线程的频繁创建和销毁,从而降低效率。因此给出另外一种做法--线程池QThreadPool。线程池的优点在于可以自动分配线程,而且可以自动对闲置的线程进行复用,提高效率。

QT为每个应用程序提供了一个全局的线程池变量对象,通过静态函数可以获取。

static QThreadPool* QThreadPool::globalInstance();

一般不需要自己创建新的线程池对象,使用该全局变量即可。得到该变量后,通过调用start()可以添加任务到线程池中,这个任务就可以被线程池处理掉了。

与上一个方法不同,进入线程池的任务对象不是继承QThread类,而是继承Qrunnabel类,然后再重写run。常用函数如下:

[pure virtual] void run();//任务写在该函数中

void setAutoDelete(bool autoDelete);//设置是否自动销毁,常设为true

建立步骤如下:

第一步:创建任务类,由于需要使用信号和槽,所以还需继承QObject,不需要则可不继承,并在构造函数中调用setAutoDelete设置是否自动销毁,建议设置为true;

Class Bubble : public QRunnabl,public QObject

第二步:在mainwindow.cpp中新建任务对象

Bubble* bubble = new Bubble;

第三步:通过线程池全局对象调用start函数添加该任务即可。

QThreadPool::globalInstance()->start(bubble);

下面是采取线程池的方法对上一示例生成的随机数进行冒泡排序和快速排序的结果



相关文章

Qt多线程编程两种方式详解(qt开启线程的三种方式)

QT的多线程编程主要有两种方式:第一种是继承自QThread,然后重写run()函数;第二种是继承自QObject,然后把整个对象moveToThread;两种方法比较:第一种方法只有run()函数是...

Qt多线程创建(qt多线程直接处理数据)

【为什么要用多线程?】传统的图形用户界面应用程序都只有一个执行线程,并且一次只执行一个操作。如果用户从用户界面中调用一个比较耗时的操作,当该操作正在执行时,用户界面通常会冻结而不再响应。这个问题可以用...

正点原子I.MX6U嵌入式Qt开发指南:第十章《多线程》

今日头条/西瓜视频/抖音短视频 同名:正点原子原子哥今日头条/西瓜视频/抖音短视频账号:正点原子-原子哥感谢各位的关注和支持,你们的关注和支持是正点原子无限前进的动力。第十章《多线程》我们写的一个应用...

Qt 的4种多线程实现详解(qt实现多线程文件传输)

为何需要多线程?1、进行耗时操作时,可以处理用户的其他输入输出。比如,如果在UI线程里面进行耗时操作,界面会不响应用户操作。2、提升程序性能。现在的电脑一般都是多核CPU,多线程并行处理事务,可以大大...

Qt快速入门(工程的创建、UI界面布局、多线程、项目)

本文档将介绍QT工程的创建、UI界面布局,并以计数器为例了解QT中多线程的用法,最终完成一个基础的QT项目。1 创建QT工程文件在安装好QT之后,能够在其安装组件中找到Qt Creator,点击设置项...

Qt多线程1:QThread(Qt多线程通信)

1. Qt多线程概述Qt有两种多线程的方法,其中一种是继承QThread的run函数,另外一种是把一个继承于QObject的类转移到一个Thread里。 Qt4.8之前都是使用继承QThread的ru...