zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    OpenCV教程(46) 快速特征检测
    OpenCV教程(45) harris角的检测(3)
    OpenCV教程(44) harris角的检测(2)
    OpenCV教程(43) harris角的检测(1)
    Andriod源码搜集
    OpenCV特征检测教程
    使用SGD(Stochastic Gradient Descent)进行大规模机器学习
    根据两点经纬度计算距离【转】
    转载]根据两点的经纬度求方位角和距离,等
    array
  • 原文地址:https://www.cnblogs.com/xiaohai123/p/13563939.html
Copyright © 2011-2022 走看看