线程池
线程池做的工作主要是控制运行线程的数量,处理过程中将任务放入队列,然后线程创建后启动这些任务,如果线程数量超过了最大线程数量,超出数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行。
作用
线程的创建和销毁的开销是巨大的,每次使用时再创建线程会严重影响性能,所以要提前创建线程,并且这个线程可以复用
第一:降低资源消耗,通过重复利用已创建的线程,降低线程创建和销毁造成的资源消耗。
第二:提交响应速度,当任务到达时,任务可以不需要等待线程创建就能执行。
第三:提高线程的可管理性。线程是稀缺资源,如果无限的创建,不仅会消耗系统的资源,还会降低系统的稳定性,使用线程池可以统一的分配,调优和监控。
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