zoukankan      html  css  js  c++  java
  • 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();//多线程启动死循环
    
    }

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

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

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

  • 相关阅读:
    iframe跨页面调用函数
    $.extend()
    tab标签 插件 by 腾讯 jianminlu
    click事件多次触发 jQuery
    vertical-align
    display:inline-block
    在父页面访问iframe的东西
    2019牛客多校第三场
    2019HDU多校第一场
    2019江苏省赛
  • 原文地址:https://www.cnblogs.com/zzzsj/p/15745625.html
Copyright © 2011-2022 走看看