Qt 最簡單的多執行緒方法QtConcurrent::run()
阿新 • • 發佈:2020-08-06
最近編寫了一個軟體,沒有考慮多執行緒的問題,編好以後,軟體在執行計算的時候,滑鼠響應有時候會延遲,但是完全能用,考慮到後續隨著計算任務的增加,滑鼠響應可能延遲會更大,所以打算使用多執行緒的方法,將執行計算的任務丟到另一個執行緒進行處理,不影響主介面對滑鼠以及各個控制元件的響應。
查了一下書以及上網搜了一下,介紹的最多的就是子類化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 }
測試結果,使用非多執行緒方法啟動死迴圈,整個程式陷入死迴圈,主介面無法響應任何操作。
使用多執行緒方法啟動死迴圈,程式還可以正常響應操作,當點選停止按鈕以後,能夠退出死迴圈,結果如下:
自己只是瞭解皮毛,更深層次的用法還沒仔細研究。