Qt 最简单的多线程方法QtConcurrent::run()(转载)
最近编写了一个软件,没有考虑多线程的问题,编好以后,软件在执行计算的时候,鼠标响应有时候会延迟,但是完全能用,考虑到后续随着计算任务的增加,鼠标响应可能延迟会更大,所以打算使用多线程的方法,将执行计算的任务丢到另一个线程进行处理,不影响主界面对鼠标以及各个控件的响应。
查了一下书以及上网搜了一下,介绍的最多的就是子类化QThread,然后重载run(),这种操作可以实现多线程,但是我的软件基本已经成形,如果再通过重载run()实现,软件改动会很大,然后我就上网查有没有什么更简单的方法,使自己的软件代码改动最小,最后查到可以使用QtConcurrent::run()的方法。根据网上说的,QtConcurrent::run()这个方法好像是较新版本Qt才支持,所以现在网上搜索Qt多线程的操作搜索到这个方法的不是很普遍。自己按照搜索结果,编写程序进行验证,发现确实很方便,对原软件架构改动非常小。
新建一个工程,创建ui界面。
首先需要在工程文件.pro中添加下面一句:
QT += concurrent
在ui界面添加三个按钮,如下图所示:
开始按钮就是不使用多线程执行一个死循环(用这个死循环代替系统原有函数功能),点击开始以后,整个软件陷入死循环,无法响应任何操作,多线程启动就是通过多线程方法执行相同的死循环,停止按钮就是退出这个死循环。
main.c代码如下:
1 #include "mainwindow.h" 2 #include <QApplication> 3 4 int main(int argc, char *argv[]) 5 { 6 QApplication a(argc, argv); 7 MainWindow w; 8 w.show(); 9 10 return a.exec(); 11 }
mainwindow.h代码如下:
1 #ifndef MAINWINDOW_H 2 #define MAINWINDOW_H 3 4 #include <QMainWindow> 5 6 namespace Ui { 7 class MainWindow; 8 } 9 10 class MainWindow : public QMainWindow 11 { 12 Q_OBJECT 13 14 public: 15 explicit MainWindow(QWidget *parent = 0); 16 void star();//多线程启动函数,在原有的代码基础上增加该函数 17 void xunhuan();//死循环函数,用这个函数代替原有代码的函数 18 ~MainWindow(); 19 20 private slots: 21 void on_pushButton_clicked(); 22 void on_pushButton_2_clicked(); 23 void on_pushButton_3_clicked(); 24 25 private: 26 Ui::MainWindow *ui; 27 int myEnable;//标志位,用于退出死循环操作 28 }; 29 30 #endif // MAINWINDOW_H
mainwindow.cpp的代码如下:
1 #include "mainwindow.h" 2 #include "ui_mainwindow.h" 3 #include<QDebug> 4 #include<QtConcurrent>//要记得添加该头文件 5 6 7 MainWindow::MainWindow(QWidget *parent) : 8 QMainWindow(parent), 9 ui(new Ui::MainWindow) 10 { 11 ui->setupUi(this); 12 myEnable = 0;//死循环标志位 13 14 } 15 16 17 void MainWindow::xunhuan()//死循环操作,代替原有代码的函数功能 18 { 19 int i=0; 20 while(myEnable) 21 { 22 i++; 23 qDebug()<<i; 24 } 25 } 26 27 void MainWindow::star()//启动函数是需要在原有代码基础上增加 28 { 29 QtConcurrent::run(this,&MainWindow::xunhuan);//多线程执行死循环启动,可以带参数,具体格式可以查阅网上其它资料 30 } 31 32 33 MainWindow::~MainWindow() 34 { 35 delete ui; 36 } 37 38 void MainWindow::on_pushButton_clicked() 39 { 40 myEnable = 1; 41 xunhuan(); //非多线程执行死循环 42 } 43 44 void MainWindow::on_pushButton_2_clicked() 45 { 46 myEnable=0;//标志位置零,退出死循环 47 qDebug()<<"退出死循环!"; 48 } 49 50 void MainWindow::on_pushButton_3_clicked() 51 { 52 53 myEnable = 1; 54 star();//多线程启动死循环 55 56 }
测试结果,使用非多线程方法启动死循环,整个程序陷入死循环,主界面无法响应任何操作。
使用多线程方法启动死循环,程序还可以正常响应操作,当点击停止按钮以后,能够退出死循环,结果如下: