Qt最简单的多线程方法QtConcurrent::run()

         最近编写了一个软件,没有考虑多线程的问题,编好以后,软件在执行计算的时候,鼠标响应有时候会延迟,但是完全能用,考虑到后续随着计算任务的增加,鼠标响应可能延迟会更大,所以打算使用多线程的方法,将执行计算的任务丢到另一个线程进行处理,不影响主界面对鼠标以及各个控件的响应。

          查了一下书以及上网搜了一下,介绍的最多的就是子类化QThread,然后重载run(),这种操作可以实现多线程,但是我的软件基本已经成形,如果再通过重载run()实现,软件改动会很大,然后我就上网查有没有什么更简单的方法,使自己的软件代码改动最小,最后查到可以使用QtConcurrent::run()的方法。根据网上说的,QtConcurrent::run()这个方法好像是较新版本Qt才支持,所以现在网上搜索Qt多线程的操作搜索到这个方法的不是很普遍。自己按照搜索结果,编写程序进行验证,发现确实很方便,对原软件架构改动非常小。

         新建一个工程,创建ui界面。

首先需要在工程文件.pro中添加下面一句:

QT += concurrent

        在ui界面添加三个按钮,如下图所示:

        开始按钮就是不使用多线程执行一个死循环(用这个死循环代替系统原有函数功能),点击开始以后,整个软件陷入死循环,无法响应任何操作,多线程启动就是通过多线程方法执行相同的死循环,停止按钮就是退出这个死循环。

        main.c代码如下:

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

       mainwindow.h代码如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    void star();//多线程启动函数,在原有的代码基础上增加该函数
    void xunhuan();//死循环函数,用这个函数代替原有代码的函数
    ~MainWindow();

private slots:
    void on_pushButton_clicked();
    void on_pushButton_2_clicked();
    void on_pushButton_3_clicked();

private:
    Ui::MainWindow *ui;
    int myEnable;//标志位,用于退出死循环操作
};

#endif // MAINWINDOW_H

        mainwindow.cpp的代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
#include<QtConcurrent>//要记得添加该头文件


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    myEnable = 0;//死循环标志位

}


void MainWindow::xunhuan()//死循环操作,代替原有代码的函数功能
{
   int i=0;
    while(myEnable)
    {
        i++;
        qDebug()<<i;
    }
}

void MainWindow::star()//启动函数是需要在原有代码基础上增加
{
    QtConcurrent::run(this,&MainWindow::xunhuan);//多线程执行死循环启动,可以带参数,具体格式可以查阅网上其它资料
}


MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    myEnable = 1;   
    xunhuan(); //非多线程执行死循环
}

void MainWindow::on_pushButton_2_clicked()
{
    myEnable=0;//标志位置零,退出死循环
    qDebug()<<"退出死循环!";
}

void MainWindow::on_pushButton_3_clicked()
{

    myEnable = 1;
    star();//多线程启动死循环

}

        测试结果,使用非多线程方法启动死循环,整个程序陷入死循环,主界面无法响应任何操作。

       使用多线程方法启动死循环,程序还可以正常响应操作,当点击停止按钮以后,能够退出死循环,结果如下:

       自己只是了解皮毛,更深层次的用法还没仔细研究。

  • 26
    点赞
  • 142
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
QtConcurrent::run方法Qt框架中提供的一种简单的并发执行函数的方式。它可以在后台线程中执行指定的函数,并在函数执行完成后返回结果。使用此方法可以很容易地实现多线程并发执行,从而提高程序的运行效率。 使用QtConcurrent::run方法需要指定要执行的函数和函数的参数。函数可以是全局函数、静态函数或者类的成员函数。参数可以是任意类型的数据,如整数、浮点数、字符串等。 以下是一个使用QtConcurrent::run方法的示例代码: ```c++ #include <QtCore> #include <QtConcurrent> void doWork(int value) { // 执行一些耗时的操作 QThread::sleep(5); qDebug() << "value: " << value; } int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); // 在后台线程中执行doWork函数 QFuture<void> future = QtConcurrent::run(doWork, 42); // 等待doWork函数执行完成 future.waitForFinished(); return app.exec(); } ``` 在上述代码中,我们定义了一个函数doWork,它接受一个整数参数value并执行一些耗时的操作。然后我们通过QtConcurrent::run方法在后台线程中执行doWork函数,并传入参数42。最后,我们使用QFuture对象等待doWork函数执行完成。 需要注意的是,QtConcurrent::run方法并不保证函数的执行顺序,因此不能依赖函数的执行顺序来编写程序。如果需要保证函数的执行顺序,可以使用QFuture对象的依赖关系来实现。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值