目录
一、QtConcurrent的使用
1、QtConcurrent介绍
QtConcurrent::run() 函数在单独的线程中运行一个函数,也就是说这是一种便捷的使用多线程的方法,实现异步运算。
1.1QtConcurrent::run() 原型
QtConcurrent::run()的原型很多,但是最基本的是以下 4 种,返回类型是QFuture,返回的结果在QFuture里面。(T是函数的返回值类型 如 void int )
QFuture< T > run( Function function ),无参
QFuture< T > run( Function function, const Arg1 &arg1 ⋯ \cdots⋯ const Arg5 &arg5),有参,参数最多5个
QFuture< T > run( const Class *object, Function function ⋯ \cdots⋯) 成员函数
QFuture< T > run(QThreadPool *pool, const Class *object, Function function ⋯ \cdots⋯) 指定 QThreadPool 的成员函数
2、QtConcurrent::run()的使用
2.1 在pro文件中添加concurrent模块(如果VS+QT,就在项目属性里添加concurrent模块)
QT += core gui concurrent
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11
2.2包含头文件
#include <QtConcurrent/qtconcurrentrun.h>
2.3在响应的槽函数中调用
QFuture<void> future = QtConcurrent::run(this, &MainWindow::自己的函数);
while (!future.isFinished())
{
QApplication::processEvents(QEventLoop::AllEvents, 30);
}
注意:有可能在这块你出现了问题,别着急,这是因为“自己的函数”需要是静态的才可以,如何把自己的函数写成静态的呢,我们接着操作。
3、QtConcurrent::run()的参数使用
3.1将自己的函数声明为静态函数
在槽函数中就不会出现问题了
void MainWindow::mqtt_recv_msg(QMQTT::Message msg) //接收消息处理
{
//QFuture<void> future = QtConcurrent::run(arrive_msg_handl,"msg");
QFuture<void> future = QtConcurrent::run(m_self->arrive_msg_handl,msg);
while (!future.isFinished())
{
QApplication::processEvents(QEventLoop::AllEvents, 30);
}
}
我的函数
如果你在静态函数中不操作UI和成员函数的话现在函数已经可以正常使用了,若果使用UI和成员函数则需要声明静态指针,用静态指针去访问!
不用静态指针访问的问题
mainwindow.cpp:264:21: error: invalid use of member 'ui' in static member function
3.2 在静态函数用静态指针访问UI和成员函数
3.2.1先在.h文件中声明静态指针
static MainWindow * m_self;/*添加个静态类指针,方便其他文件加上该头文件后,可以调用这里的成员函数*/
3.2 .2初始化和实例化静态类指针
MainWindow* MainWindow::m_self = nullptr;
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent),ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_self = this;
}
3.3静态指针访问UI和成员函数
现在函数就能正常使用了!
4、QtConcurrent::run()的参数使用
后来发现不使用静态函数也能够使用这个函数
正确使用函数的方法为
QFuture<void> mysql = QtConcurrent::run(this,&MainWindow::函数名字,参数1,参数2,参数3);