Qt 最簡單的多線程方法QtConcurrent::run()


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 }
復制代碼

測試結果,使用非多線程方法啟動死循環,整個程序陷入死循環,主界面無法響應任何操作。

       使用多線程方法啟動死循環,程序還可以正常響應操作,當點擊停止按鈕以后,能夠退出死循環,結果如下:

原文鏈接:https://www.cnblogs.com/ybqjymy/p/13446608.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM