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
Qt 最简单的多线程方法QtConcurrent::run()的更多相关文章
- QT从入门到入土(四)——多线程(QtConcurrent::run())
引言 在前面对Qt多线程(QThread)做了详细的分析:QT从入门到入土(四)--多线程(QThread) - 唯有自己强大 - 博客园 (cnblogs.com) 但是最近在做项目时候,要将一个函 ...
- 【QT】QtConcurrent::run()+QThreadPool实现多线程
往期链接: <QThread源码浅析> <子类化QThread实现多线程> <子类化QObject+moveToThread实现多线程> <继承QRunnab ...
- Qt5.9一个简单的多线程实例(类QThread)(第一种方法)
Qt开启多线程,主要用到类QThread.有两种方法,第一种用一个类继承QThread,然后重新改写虚函数run().当要开启新线程时,只需要实例该类,然后调用函数start(),就可以开启一条多线程 ...
- 多线程 start 和 run 方法到底有什么区别?
昨天栈长介绍了<Java多线程可以分组,还能这样玩!>线程分组的妙用.今天,栈长会详细介绍 Java 中的多线程 start() 和 run() 两个方法,Java 老司机请跳过,新手或者 ...
- 一个简单的多线程Python爬虫(一)
一个简单的多线程Python爬虫 最近想要抓取拉勾网的数据,最开始是使用Scrapy的,但是遇到了下面两个问题: 前端页面是用JS模板引擎生成的 接口主要是用POST提交参数的 目前不会处理使用JS模 ...
- CreateThread简单那多线程编程
CreateThread简单那多线程编程 作者:vpoet mail:vpoet_sir@163.com 在进行多任务处理的时候我们往往会用到多线程技术,多线程理论上是多个线程同事处理不同的工作,但是 ...
- Java Tread多线程(0)一个简单的多线程实例
作者 : 卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/39341887 本文演示,一个简单的多线程实例,并简单分析一下线程. 编程多 ...
- Python 简单理解多线程
进程,是一个或多个线程的集合,每个进程在内存中是相对独立的. 线程,是计算机最小的运算单元,每个进程至少要有一个线程,多个线程时,每个线程间之间共享内存. 分别举例常规运行和多线程运行: 0)常规运行 ...
- 演练:使用VS2010 C# 创作简单的多线程组件
BackgroundWorker 组件取代了 System.Threading 命名空间并添加了功能:但是,可以选择保留 System.Threading 命名空间以实现向后兼容并供将来使用.有关更多 ...
随机推荐
- PHP strtotime() 函数
------------恢复内容开始------------ 实例 将任何字符串的日期时间描述解析为 Unix 时间戳: <?php // 设置时区 date_default_timezone_ ...
- [SCOI2007]降雨量 线段树和区间最值(RMQ)问题
这道题是比较经典的 \(RMQ\) 问题,用线段树维护是比较简单好写的.比较难的部分是判断处理.如果没有想好直接打代码会调很久(没错就是我).怎么维护查询区间最大值我就不再这里赘述了,不懂线段树的 ...
- 04-Thread的生命周期
图示: 说明: 1.生命周期关注两个概念:状态.相应的方法 2.关注:状态a-->状态b:哪些方法执行了(回调方法) 某个方法主动调用:状态a-->状态b 3.阻塞:临时状态,不可以作为最 ...
- “随手记”开发记录day01
今天进行了第二次团队会议,并且开始了“随手记”APP的开发. 今天,我们的完成了登陆.注册页面,开始完成记账部分页面和个人信息页面. 完成页面如下:
- 牛!Python 也能实现图像姿态识别溺水行为了!
作者 | 李秋键 责编 | Carol 封图 | CSDN 下载自视觉中国 众所周知随着人工智能智能的发展,人工智能的落地项目也在变得越来越多,尤其是计算机视觉方面. 很多人学习python,不知道从 ...
- JS 获取验证码按钮改变案例
HTML代码 <div class="box"> <label for="">手机号</label> <input t ...
- JS DOM操作案例
显示隐藏表单文本内容 <input type="text" value="手机"> var text = document.querySelecto ...
- Django Web 测试
Django 单元测试 模拟浏览器发起请求,测试 web 功能.只是简单记录一下怎么使用. 环境 Win10 Python2.7 Django 1.8.11 MySQL5.6 项目结构 大致如下 my ...
- MyBatisPlus性能分析插件,条件构造器,代码自动生成器详解
性能分析插件 我们在平时的开发中,会遇到一些慢sql,测试,druid MP(MyBatisPlus)也提供性能分析插件,如果超过这个时间就停止 不过官方在3.2版本的时候取消了,原因如下 条件构造器 ...
- 文件上传Upload 学习笔记
整理完自己还有点晕,看来还是得找点靶场自己练习练习Orz 1:客户端JavaScript校验 Burp改包即可 2:服务端对Content-Type进行校验 猜测后,修改对应Content-Type字 ...