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 date_sunset() 函数
------------恢复内容开始------------ 实例 返回葡萄牙里斯本今天的日落时间: <?php// Lisbon, Portugal:// Latitude: 38.4 Nor ...
- bzoj 1738 [Usaco2005 mar]Ombrophobic Bovines 发抖的牛 最大流+二分
题目要求所有牛都去避雨的最长时间最小. 显然需要二分 二分之后考虑如何判定. 显然每头牛都可以去某个地方 但是前提是最短路径<=mid. 依靠二分出来的东西建图.可以发现这是一个匹配问题 din ...
- C笔记-左值与右值
目录 前言:工欲善其事,必先利其器 两种资料 参考资料及其使用说明 官方对于左值和右值的定义 实际使用时的疑问 左值的涵盖范围 重要概念: 左值转化(lvalue conversion) 左值与指针 ...
- 区块链钱包开发 - USDT - 二、创建交易错误以及解决方法
这里总结了开发中一些常见报错和解决方案 1. 提示:createRawtx_change "Amount is not a number" 解决:参数中 tx 的 amout 需要 ...
- java学习day01之String的特点,如何实现,并且有哪些重要方法?
1.以主流的JDK版本1.8来说,String内部实际存储结构为char数组,源码如下: public final class String implements java.io.Serializa ...
- Python turtle库的画笔控制说明
turtle.penup() 别名 turtle.pu() :抬起画笔海龟在飞行 turtle.pendown() 别名 turtle.pd():画笔落下,海龟在爬行 turtle.pensize(w ...
- java_环境搭建、变量的使用
java_环境搭建.变量的使用 Java语言开发环境搭建 1. Java虚拟机——JVM JVM(Java Virtual Machine ):Java虚拟机,简称JVM,是运行所有Java程序的假想 ...
- one of the variables needed for gradient computation has been modified by an inplace operation: [torch.cuda.FloatTensor [3, 1280, 28, 28]], which is output 0 of LeakyReluBackward1, is at version 2;
RuntimeError: one of the variables needed for gradient computation has been modified by an inplace o ...
- 2020-07-23:开启rdb后,redis的启动流程是怎样的?
福哥答案2020-07-23: Redis 在完成初始化全局服务器配置,加载配置文件,初始化服务器,开始加载持久化的数据到内存中.如果启用了 appendonly 了,则Redis从 appendfi ...
- Flutter 容器 (2) - Padding
Padding: 内边距Widget,与CSS中的padding相似. import 'package:flutter/material.dart'; class AuthList extends S ...