QtConcurrent::run()的作用是使函数在另一个线程中执行。
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QThread>
#include <QtConcurrent>
#include <QFutureWatcher>
#include <QApplication>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
qDebug()<<"main thread"<<QThread::currentThreadId();
}
Widget::~Widget()
{
delete ui;
}
定义3个函数 参数个数不同
QString Widget::fun1(int s1,int s2,int s3,int s4,int s5)
{
qDebug()<<"fun1"<<s1<<s2<<QThread::currentThreadId();
return QString("%1__%2").arg(s1).arg(s2);
}
void Widget::fun2(int s1)
{
qDebug()<<"fun2"<<s1<<QThread::currentThreadId();
}
int Widget::fun3(int s1)
{
QThread::msleep(1000);
qDebug()<<"fun3"<<s1<<QThread::currentThreadId();
return s1*100;
}
//调用
void Widget::on_pushButton_clicked()
{
//QtConcurrent::run Widget::fun1函数的参数不能超过5个
QFuture<QString> result = QtConcurrent::run(this,&Widget::fun1,666,555,1,2,3);
result.waitForFinished();//阻塞调用
qDebug()<<"调用结果"<<result.result();
QFuture<void> result2 = QtConcurrent::run(this,&Widget::fun2,888);
//异步调用
QFutureWatcher<int> * watcher = new QFutureWatcher<int>;
connect(watcher, &QFutureWatcher<int>::finished,[this,watcher]()
{
qDebug()<<"result3 完成";
delete watcher;
});
QFuture<int> result3 = QtConcurrent::run(this,&Widget::fun3,999);
watcher->setFuture(result3);
}
结果: