Qt中的多线程与线程池浅析+实例

本文介绍了Qt中的多线程和线程池,包括QThread类的使用,两种多线程创建方式及其区别,以及线程池的工作原理和QRunnable、QThreadPool的应用。通过实例展示了如何使用线程池进行任务调度,强调了线程池在资源管理上的优势。
摘要由CSDN通过智能技术生成

1. Qt中的多线程与线程池

今天学习了Qt中的多线程和线程池,特写这篇博客来记录一下

2. 多线程

2.1 线程类 QThread

Qt 中提供了一个线程类,通过这个类就可以创建子线程了,Qt 中一共提供了两种创建子线程的方式,先看一下这个类中提供的一些常用 API 函数:

2.1.1 常用函数

// QThread 类常用 API
// 构造函数
QThread::QThread(QObject *parent = Q_NULLPTR);
// 判断线程中的任务是不是处理完毕了
bool QThread::isFinished() const;
// 判断子线程是不是在执行任务
bool QThread::isRunning() const;

// Qt中的线程可以设置优先级
// 得到当前线程的优先级
Priority QThread::priority() const;
void QThread::setPriority(Priority priority);
优先级:
    QThread::IdlePriority		--> 最低的优先级
    QThread::LowestPriority
    QThread::LowPriority
    QThread::NormalPriority
    QThread::HighPriority
    QThread::HighestPriority
    QThread::TimeCriticalPriority
    QThread::InheritPriority    --> 最高的优先级, 默认是这个


// 退出线程, 停止底层的事件循环
// 退出线程的工作函数
void QThread::exit(int returnCode = 0);
// 调用线程退出函数之后, 线程不会马上退出因为当前任务有可能还没有完成, 调回用这个函数是
// 等待任务完成, 然后退出线程, 一般情况下会在 exit() 后边调用这个函数
bool QThread::wait(unsigned long time = ULONG_MAX);

2.1.2 信号槽

// 和调用 exit() 效果是一样的
// 代用这个函数之后, 再调用 wait() 函数
[slot] void QThread::quit();
// 启动子线程
[slot] void QThread::start(Priority priority = InheritPriority);
// 线程退出, 可能是会马上终止线程, 一般情况下不使用这个函数
[slot] void QThread::terminate();

// 线程中执行的任务完成了, 发出该信号
// 任务函数中的处理逻辑执行完毕了
[signal] void QThread::finished();
// 开始工作之前发出这个信号, 一般不使用
[signal] void QThread::started();

2.1.3 静态函数

// 返回一个指向管理当前执行线程的QThread的指针
[static] QThread *QThread::currentThread();
// 返回可以在系统上运行的理想线程数 == 和当前电脑的 CPU 核心数相同
[static] int QThread::idealThreadCount();
// 线程休眠函数
[static] void QThread::msleep(unsigned long msecs);	// 单位: 毫秒
[static] void QThread::sleep(unsigned long secs);	// 单位: 秒
[static] void QThread::usleep(unsigned long usecs);	// 单位: 微秒

2.1.4 run()函数

// 子线程要处理什么任务, 需要写到 run() 中
[virtual protected] void QThread::run();

run()函数非常重要,当线程执行的时候,就是去执行run()函数中的代码

2.2 使用方式一

  1. 需要创建一个线程类的子类,让其继承 QT 中的线程类 QThread
  2. 重写父类的 run () 方法,在该函数内部编写子线程要处理的具体的业务流程
  3. 在主线程中创建子线程对象,new 一个就可以了
  4. 启动子线程,调用 start () 方法
    当子线程别创建出来之后,父子线程之间的通信可以通过信号槽的方式,注意事项:
  • 在 Qt 中在子线程中不要操作程序中的窗口类型对象,不允许,如果操作了程序就挂了
  • 只有主线程才能操作程序中的窗口对象,默认的线程就是主线程,自己创建的就是子线程

2.3 实例

现在我们来完成一个功能,就是先随机生成很多随机数,然后通过冒泡排序,和快速排序的方法去执行,并且显示出来

  1. 首先画出一个窗口
    在这里插入图片描述
    长这个样子

  2. 创建线程类 MyThread

说明:

  • Generate类是用来生成随机数的,其中有个槽方法recvNum,用来接受start信号传进来的参数,参数的值为生成的随机数的个数,run()方法为生成随机数的代码
  • BubbleSort和QuickSort类 都是用来排序的类,只是排序的方法不同,其中recvArray是为了接受传过来的随机数用来排序,finish信号是将排序好的数组传给主线程

头文件 MyThread.h



#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QThread>
#include <QVector>

class Generate : public QThread
{
   
    Q_OBJECT
public:
    explicit Generate(QObject *parent = nullptr);

    void recvNum(int num);

protected:
    void run() override;

private:
    int m_num;

signals:
    void sendArray(QVector<int> num);

};

// 冒泡线程类
class BubbleSort : public QThread
{
   
    Q_OBJECT
public:
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值