Qt中使用线程池

线程池

线程池做的工作主要是控制运行线程的数量,处理过程中将任务放入队列,然后线程创建后启动这些任务,如果线程数量超过了最大线程数量,超出数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行。

作用

线程的创建和销毁的开销是巨大的,每次使用时再创建线程会严重影响性能,所以要提前创建线程,并且这个线程可以复用
第一:降低资源消耗,通过重复利用已创建的线程,降低线程创建和销毁造成的资源消耗。
第二:提交响应速度,当任务到达时,任务可以不需要等待线程创建就能执行。
第三:提高线程的可管理性。线程是稀缺资源,如果无限的创建,不仅会消耗系统的资源,还会降低系统的稳定性,使用线程池可以统一的分配,调优和监控。

Qt中线程池使用

线程池
1) 线程池用于管理线程,用来减少大量线程被创建和销毁时时的时间损耗。类名为QThreadPool,Qt程序默认有一个全局的线程池,可以通过globalInstance()获取。
2) 线程池中存放的工作对象需要继承自QRunnable,并重写run函数(只有run函数是在新线程中执行)。该对象默认执行完run函数后会被自动删除,当然你也可以使用QRunnable::setAutoDelete()更改是否自动删除。
3)调用maxThreadCount()查询线程池的最大线程数,没有自行设置的话默认是当前正在工作的线程数。使用setMaxThreadCount()可以更改来限制线程数,不更改的话默认没有上限。
4)线程池中的线程停止工作的话默认30s过期并销毁,可以使用setExpiryTimeout()来更改限制,设置负数则其中的线程永不过期。

线程重写

线程类需要继承 QRunnable,重写 run() 方法,如果使用信号和槽还要继承QObject,并且放在最前面

// 生成随机数
class Generate : public QObject, public QRunnable
{
    Q_OBJECT
public:
    explicit Generate(QObject *parent = nullptr);
    void recvNum(int num);
    void run() override;
signals:
    void sendArray(QVector<int> num);
private:
    int m_num;
};

// 冒泡排序
class BubbleSort : public QObject, public QRunnable
{
    Q_OBJECT
public:
    explicit BubbleSort(QObject *parent = nullptr);

    void recvArray(QVector<int> list);

    void run() override;

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

private:
    QVector<int> m_list;

};

//快速排序
class QuickSort : public QObject, public QRunnable
{
    Q_OBJECT
public:
    explicit QuickSort(QObject *parent = nullptr);

    void recvArray(QVector<int> list);

    void run() override;

private:
    void quickSort(QVector<int> &list, int l, int r);

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

private:
    QVector<int> m_list;

};

加入线程池

// 1. 创建任务类对象
 Generate* gen = new Generate;
 BubbleSort* bubble = new BubbleSort;
 QuickSort* quick = new QuickSort;

  // 2. 启动子线程
 connect(this, &MainWindow::starting, gen, &Generate::recvNum);
 emit starting(10000);
 QThreadPool::globalInstance()->start(gen);  //将任务对象放到线程池

 connect(gen, &Generate::sendArray, bubble, &BubbleSort::recvArray);
 connect(gen, &Generate::sendArray, quick, &QuickSort::recvArray);
 // 接收子线程发送的数据
 connect(gen, &Generate::sendArray, this, [=](QVector<int> list){
     QThreadPool::globalInstance()->start(bubble);
     QThreadPool::globalInstance()->start(quick);
     for(int i=0; i<list.size(); ++i)
     {
         ui->randList->addItem(QString::number(list.at(i)));
     }
 });
 connect(bubble, &BubbleSort::finish, this, [=](QVector<int> list){
     for(int i=0; i<list.size(); ++i)
     {
         ui->bubbleList->addItem(QString::number(list.at(i)));
     }
 });
 connect(quick, &QuickSort::finish, this, [=](QVector<int> list){
     for(int i=0; i<list.size(); ++i)
     {
         ui->quickList->addItem(QString::number(list.at(i)));
     }
 });

 //线程的创建和销毁由线程池维护,不需要关心线程内存问题,只需要在线程的析构函数去释放线程内部的内存

这样就可以启动并将线程放置于线程池中

下载完整程序:https://download.csdn.net/download/qq_40170041/87512583

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值