QtConcurrent名称空间提供了高级api,可以在不使用低级线程原语的情况下编写多线程程序。
QtConcurrent名称空间提供了高级api,使编写多线程程序成为可能,而无需使用低级的线程原语(如互斥体、读写锁、等待条件或信号量)。使用QtConcurrent编写的程序可以根据可用的处理器内核数自动调整线程数。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QColor>
#include <QtConcurrent>
#include <QVector>
#include <QTimer>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
int func2(int a)
{
int b= 1;
for (int j=0;j<10000;j++) {
for (int k=0;k<10000;k++) {
b=j+k;
}
}
qDebug()<<"thread ID"<<QThread::currentThreadId();
return b + 1;
}
/**
* @brief MainWindow::on_pushButton_clicked 和on_pushButton_2_clicked可以看出
* QtConcurrent::mapped 可以并行运算起到加速的效果
*/
void MainWindow::on_pushButton_clicked()
{
QTime t;
t.start();
QList<int> alist;
alist<<1<<3<<5<<7<<9;
QFuture<int> f = QtConcurrent::mapped(alist,func2); //QFuture的类型为int
f.waitForFinished();
qDebug()<<"alist"<<alist;
QList<int> newlist = f.results();
qDebug()<<"newlist"<<newlist;
qDebug()<<__FUNCTION__<<t.elapsed();
}
void MainWindow::on_pushButton_2_clicked()
{
QTime t;
t.start();
QList<int> alist;
alist<<1<<3<<5<<7<<9;
QList<int> newlist;
for(int i=0;i<alist.size();i++){
newlist<<func2(alist.at(i));
}
qDebug()<<"alist"<<alist;
qDebug()<<"newlist"<<newlist;
qDebug()<<__FUNCTION__<<t.elapsed();
}
结果:
thread ID 0x1b428
thread ID 0x1c960
thread ID 0x1e48c
thread ID 0x1ddb8
thread ID 0x1b428
alist (1, 3, 5, 7, 9)
newlist (19999, 19999, 19999, 19999, 19999)
MainWindow::on_pushButton_clicked 511
thread ID 0x1e790
thread ID 0x1e790
thread ID 0x1e790
thread ID 0x1e790
thread ID 0x1e790
alist (1, 3, 5, 7, 9)
newlist (19999, 19999, 19999, 19999, 19999)
MainWindow::on_pushButton_2_clicked 1260
可以看出
QtConcurrent::mapped 可以并行运算起到加速的效果
f.waitForFinished(); 依然会阻塞ui。