赞
踩
QThreadPool类管理一个QThread集合。
QThreadPool管理和重新设计单个QThread对象,以帮助降低使用线程的程序中的线程创建成本。每个Qt应用程序都有一个全局QThreadPool对象,可以通过调用globalInstance来访问该对象。
要使用其中一个QThreadPool线程,请子类化QRunnable并实现run虚拟函数。然后创建该类的一个对象,并将其传递给QThreadPool::start。
主要特点:
QThreadPool
实例。QRunnable
对象添加到线程池的任务队列中,并在线程池中的一个线程上执行它。QRunnable
对象,如果失败则返回 false
。我们创建了一个简单的 QRunnable
子类 MyRunnable
,并在主函数中使用了 QThreadPool
来执行 4 个任务。我们设置了线程池的最大线程数为 4,这意味着同时最多有 4 个线程在执行任务。其他的任务会在线程池中的线程变为可用时被执行。
- #include "widget.h"
- #include "ui_widget.h"
- #include <QRunnable>
- #include <QThreadPool>
- #include <QDebug>
- #include <QMutex>
- #include <QList>
-
- QList<int> g_list;
- QMutex g_mutex;
-
- class MyRunnable : public QRunnable
- {
- public:
- void run() override
- {
- while(true)
- {
- g_mutex.lock();
- if(g_list.size() == 0)
- {
- g_mutex.unlock();
- break;
- }
- qDebug() << "Task running in thread:" << QThread::currentThread() << "deal num "<<g_list.first();
- g_list.pop_front();
- g_mutex.unlock();
- }
- qDebug() << "Task running in thread:" << QThread::currentThread() << "finished ";
- }
- };
-
- Widget::Widget(QWidget *parent) :
- QWidget(parent),
- ui(new Ui::Widget)
- {
- ui->setupUi(this);
-
- for(int i=0;i<20;i++)
- {
- g_list.append(i);
- }
-
- QThreadPool::globalInstance()->setMaxThreadCount(4);
-
- for (int i = 0; i < 4; ++i)
- {
- MyRunnable *r = new MyRunnable();
- r->setAutoDelete(true);
- QThreadPool::globalInstance()->start(r);
-
- }
- }
-
- Widget::~Widget()
- {
- delete ui;
- }
-
运行结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。