便捷的使用多线程并发类QtConcurrent解决Qt在槽函数中执行耗时操作导致界面卡住的问题

目录

一、QtConcurrent的使用

1、QtConcurrent介绍

1.1QtConcurrent::run() 原型

2、QtConcurrent::run()的使用

3、QtConcurrent::run()的参数使用

3.1将自己的函数声明为静态函数

 3.2 在静态函数用静态指针访问UI和成员函数


一、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);

  • 0
    点赞
  • 8
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:精致技术 设计师:CSDN官方博客 返回首页
评论

打赏作者

吻等离子

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值