【QT5-自我学习-线程qThread练习-两种使用方式-1:通过继承线程类来使用-基础样例】

【QT5-自我学习-线程qThread练习-两种使用方式-1:通过继承线程类来使用-基础样例】

  • 1、前言
  • 2、实验环境
  • 3-1、学习链接-参考文章
  • 3-2、先前了解-自我总结
      • (1)线程处理逻辑事件,不能带有主窗口的事件
      • (2)一般考虑使用的时候,是当你发现,主窗口会有卡顿,需要线程在后台来处理。
      • (3)通过继承线程类这种方式,自己觉得在使用时,主要注意两点。
  • 4、实验过程
    • (0)实验目标
    • (1)新建工程
    • (2)UI布局
    • (3)线程类代码编写
    • (4)编写mainwindow.cpp内容。
  • 5-1、实际效果
  • 5-2、代码链接
  • 6、细节部分
      • (1)main.cpp加入一段声明代码。
      • (2)拉姆达表达式
  • 7、总结

1、前言

学习线程其实有一段时间了,当时只是学习,没有实际用起来,最近做的一个qt程序,发现如果不使用线程,那么就会导致界面卡死,这样才体现出线程的实际作用。

发现卡顿的程序就是前几天说到的“【QT调用ST-link-使用QT编写程序-调用ST-LINK_CLI.exe-烧写STM32F4xxx-基础样例】”程序。
在融合的时候,发现如果不适用线程,并且下载程序很大的时候,就会直接卡住,虽然等下完后,界面就好了,但是这绝对不是我们想要的。于是融合了线程,发现能够解决这一问题,同时也对线程有了熟悉。

2、实验环境

实验环境还是挺重要的,因为有时候,在你电脑上能运行的东西,在别人的电脑就不一定能运行,这一部分的原因就可能是实验版本不一样。
系统环境:window环境
QT软件版本:qt 5.14.2
ST-Link命令行工具的版本号:STM32 ST-LINK CLI v3.6.0.0
硬件开发板:STM32F407ZET6(正点原子:探索者)
下载器:ST-link
在这里插入图片描述

3-1、学习链接-参考文章

自己也是参考他人文章,通过学习他人的文章与视频学习了qt多线程,当然要说明出处。
如下是博客地址,里面相关概念总结:https://subingwen.cn/qt/thread/
在这里插入图片描述
如下是B站上视频,也是通过视频,敲的代码:https://www.bilibili.com/video/BV1iN411f7dY/?spm_id_from=333.337.search-card.all.click&vd_source=631b10b31b63df323bac39281ed4aff3
在这里插入图片描述

3-2、先前了解-自我总结

博客文章说得已经非常好了,自己也会重新总结下。

(1)线程处理逻辑事件,不能带有主窗口的事件

线程可以在后台辅助你,对一些数据进行除了,但是对于主界面的控件等,不能直接控制,从使用来说,
以下是一个例子,不能直接使用以下方式来调用界面的控件。

ui->label->setText("data");

当然是可以通过一些信号与槽,或者全局变量的方式来传递。

(2)一般考虑使用的时候,是当你发现,主窗口会有卡顿,需要线程在后台来处理。

我自己本次使用的时候,是因为碰到st-link烧写,并且文件很大的时候,主界面会直接卡住,才考虑使用,而不要是为了使用而使用,当你觉得主界面太卡,并且可以放在后台执行的时候,那么你就可以开一个线程。

(3)通过继承线程类这种方式,自己觉得在使用时,主要注意两点。

1、连接号信号与槽
2、编写run函数内容
我们很多时候,是先学习怎么去做,然后返回来在具体了解内部细节的。

4、实验过程

(0)实验目标

采用两种不同速度排序的方式,对一个乱序的数组进行排序,这个过程中,需要生产乱序数组,使用一个线程,两种排序需要使用两个线程,所有一种有3个线程。

(1)新建工程

新建工程,是qtk开始的步骤,至少先让你的空白模块跑起来,如下,这里就不过多叙述了。
在这里插入图片描述

(2)UI布局

我们需要是三个框,也就是listWidget,分别放置三个数组,一个是乱序数组,另外两个是冒泡排序和快排,如下。
在这里插入图片描述

(3)线程类代码编写

虽然自己是看着他人资料,但是不想完全安装他人的,给自己增加些难度,分成了3个文件。
(1)添加新的文件,在项目上右键,然后选择“Add New…”
在这里插入图片描述

(2)添加新的C++文件,然后命名,
在这里插入图片描述

(3)这里可以先不选任何include,随后我们手头添加即可
在这里插入图片描述

(4)编写对于”mythread.h“和“mythread.cpp”内容。
我们需要继承线程类,编写功能函数声明,run函数声明的,如下代码快,

#ifndef MYTHREAD_H
#define MYTHREAD_H#include <QThread>class myThread_rand : public QThread
{Q_OBJECT
public:explicit myThread_rand(QObject *parent = nullptr);void recvNum(int num);
protected:void run() override;signals:void sendArray(QVector<int> num);
private:int m_num;};#endif // MYTHREAD_H

“mythread.cpp”内容,主要是实现相应函数内容,这里也直接给出代码块。

#include "mythread.h"
#include <QElapsedTimer>
#include <QDebug>myThread_rand::myThread_rand(QObject *parent) : QThread(parent)
{}void myThread_rand::recvNum(int num)
{m_num=num;
}void myThread_rand::run(){qDebug() << "生成随机数的线程地址为:" << QThread::currentThread() << endl;QVector<int> list;QElapsedTimer time;time.start();for(int i=0;i<m_num;++i){list.push_back(qrand()%10000);}int milsec = time.elapsed();qDebug() << "生成"  << m_num<< "个随机总数用时:"<< milsec <<"毫秒" <<endl;emit sendArray(list);}

(5)然后就是快派和冒泡的两个部分代码块。重复工作,这里直接截图,具体细节,请看我提供的代码连接。
1、bublesort.h
在这里插入图片描述

2、bublesort.cpp,这里在run中放入排序方式,使用双循环的冒泡,然后放入计时的,就是记录线程的函数。
在这里插入图片描述
3、quicksort.h,快排头文件,一些函数声明等。
在这里插入图片描述
4、quciksort.cpp,快排操作函数,这里库里只有相应函数,我们直接调用就好,就没按照参考文章里,再去实现一遍。
在这里插入图片描述

(4)编写mainwindow.cpp内容。

这里的工作,主要是将各个函数连接起来,并传递数据,因为我们是分文件编写,需要包含,这点请注意,然后按照编好步骤依次编写,这里我自己已经写了步骤,请自己看代码吧。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "mythread.h"
#include "bubblesort.h"
#include "quicksort.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//1.创建子线程对象myThread_rand* gen=new myThread_rand;bubblesort_thread* bubble=new  bubblesort_thread;quickSort_thread* quick=new quickSort_thread;//链接connect(this,&MainWindow::starting,gen,&myThread_rand::recvNum);//2、启动gen(产生随机数据)子线程+lambda表达式connect(ui->pushButton,&QPushButton::clicked,this,[=](){//发送信号emit starting(10000);//启动线程gen->start();});//链接connect(gen,&myThread_rand::sendArray,bubble,&bubblesort_thread::recvArray);connect(gen,&myThread_rand::sendArray,quick,&quickSort_thread::recvArray);//3、启动(排序和快排)子线程发送的数据+ 随机数显示connect(gen,&myThread_rand::sendArray,this,[=](QVector<int> list){bubble->start();quick->start();for(int i=0;i<list.size();++i){ui->listWidget_randList->addItem(QString::number(list.at(i)));}});//4、(冒泡线程)接收子线程发送的数据+(冒泡)排序后显示connect(bubble,&bubblesort_thread::finish,this,[=](QVector<int> list){for(int i=0;i<list.size();++i){ui->listWidget_bubuleList->addItem(QString::number(list.at(i)));}});//4、(快排线程)接收子线程发送的数据+(快排)排序后显示connect(quick,&quickSort_thread::finish,this,[=](QVector<int> list){for(int i=0;i<list.size();++i){ui->listWidget_quickList->addItem(QString::number(list.at(i)));}});}MainWindow::~MainWindow()
{delete ui;
}

5-1、实际效果

实际效果如下,还是可以看到,不同算法,排序实际确实不是一样的。
在这里插入图片描述

5-2、代码链接

代码链接:https://download.csdn.net/download/qq_22146161/88241687

6、细节部分

(1)main.cpp加入一段声明代码。

根据博主说明,要在main.cpp加入一段声明代码,否则会有错误。
在这里插入图片描述
如下,如果注释掉,就会有问题。
在这里插入图片描述

(2)拉姆达表达式

自己确实不是很深入了解,先学着使用吧,用起来之后,再慢慢理解。
在这里插入图片描述
(3)用于计时线程的类,这个类还是挺方便的,可以帮我们计时,不过使用时,要注意包含,声明等。
在这里插入图片描述

7、总结

一个模块的学习,会成为一块砖,成为你的垫脚石,或者一个建筑的一块砖。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/105535.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode75】第三十五题 统计二叉树中好节点的数目

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 给我们一棵二叉树&#xff0c;让我们统计这棵二叉树中好节点的数目。 那么什么是好节点&#xff0c;题目中给出定义&#xff0c;从根节点…

华为OD机试之报文重排序【Java源码】

题目描述 对报文进行重传和重排序是常用的可靠性机制&#xff0c;重传缓中区内有一定数量的子报文&#xff0c;每个子报文在原始报文中的顺序已知&#xff0c;现在需要恢复出原始报文。 输入描述 输入第一行为N&#xff0c;表示子报文的个数&#xff0c;0 &#xff1c;N ≤ …

UE4/5Niagara粒子特效之Niagara_Particles官方案例:1.5->2.3

目录 之前的文章&#xff1a; 1.5 Blend Attributes by Value 发射器更新 粒子生成 粒子更新 2.1 Static Beams ​编辑 发射器更新&#xff1a; 粒子生成 粒子更新 2.2 Dynamic Beams 没有开始模拟前的效果是&#xff1a; 开始模拟后的效果是&#xff1a; 发射器更新 …

【C++入门到精通】C++入门 —— 继承(基类、派生类和多态性)

阅读导航 前言一、继承的概念及定义1. 继承的概念2.继承的定义⭕定义格式⭕继承关系和访问限定符⭕继承基类成员访问方式的变化 二、基类和派生类对象赋值转换三、继承中的作用域四、派生类的默认成员函数五、继承与友元六、继承与静态成员七、复杂的菱形继承及菱形虚拟继承⭕单…

C# OpenCvSharp DNN 二维码增强 超分辨率

效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using OpenCvSharp; using OpenCvSharp.Dnn; using OpenCvSh…

如何将储存在Mac或PC端的PDF文件传输到移动设备呢?

iMazing是一款iOS设备管理软件&#xff0c;用户借助它可以将iPad或iPhone上的文件备份到PC或Mac上&#xff0c;还能实现不同设备之间的文件传输&#xff0c;能很大程度上方便用户进行文件管理。 在阅读方面&#xff0c;iPad和iPhone是阅读PDF的优秀选择&#xff0c;相较于Mac或…

Java 基于 SpringBoot+Vue 的在线考试系统的研究与实现,2.0 版本

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 第一章第二章.主要技术第三章第四章 系统设计4.1功能结构4.2 数据库设计4.2.1 数据库E/R图4.2.2 数…

docker-compose管理创建LNMP服务并运行Wordpress网站平台

文章目录 一&#xff0e;项目环境1. 环境描述2.项目需求 二&#xff0e;部署过程1.安装Docker2.安装Docker加速器3.Docker-Compose安装部署4.准备依赖文件、配置nginx5.配置mysql6.配置php7.编写docker-compose.yml8.验证 三.容器快照&#xff0c;然后将Docker镜像打包成tar包备…

JDBC概述

JDBC概述 核心JDBC组件 JDBC驱动程序连接声明结果集 常见JDBC用例 查询数据库查询数据库元数据更新数据库执行事务 JDBC组件交互图 JDBC API由以下核心部分组成&#xff1a; JDBC驱动程序连接声明结果集 有四个基本的JDBC用例&#xff0c;大多数JDBC工作都围绕这些用例发展…

C++信息学奥赛1138:将字符串中的小写字母转换成大写字母

#include<bits/stdc.h> using namespace std; int main() {string arr;// 输入一行字符串getline(cin, arr);for(int i0;i<arr.length();i){if(arr[i]>97 and arr[i]<122){char aarr[i]-32; // 将小写字母转换为大写字母cout<<a; // 输出转换后的字符}els…

电工-学习电工有哪些好处

学习电工有哪些好处&#xff1f;在哪学习电工&#xff1f; 学习电工有哪些好处&#xff1f;在哪学习电工&#xff1f;学习电工可以做什么&#xff1f;优势有哪些&#xff1f; 学习电工可以做什么&#xff1f;学习电工有哪些好处&#xff1f; 就业去向&#xff1a;可在企业单位…

分布式搜索引擎----elasticsearch

目录 1、初识elasticsearch 1.1、什么是elasticsearch 1.2.ELK技术栈 2、正向索引和倒排索引 2.1、正向索引 2.2、倒排索引 2.3、正向索引和倒排索引的区别 3、elasticsearch中的概念理解 3.1、文档和字段 3.2、索引和映射 3.3、mysql与elasticsearch 1、初识elasti…

Hadoop分布式计算与资源调度:打开专业江湖的魔幻之门

文章目录 版权声明一 分布式计算概述1.1 分布式计算1.2 分布式&#xff08;数据&#xff09;计算模式1.3 小结 二 MapReduce概述2.1 分布式计算框架 - MapReduce2.2 MapReduce执行原理2.3 小结 三 YARN概述3.1 YARN & MapReduce3.2 资源调度3.3 程序的资源调度3.4 YARN的资…

RabbitMQ---基本消息模型

1、 基本消息模型 官方介绍&#xff1a; RabbitMQ是一个消息代理&#xff1a;它接受和转发消息。 你可以把它想象成一个邮局&#xff1a;当你把邮件放在邮箱里时&#xff0c;你可以确定邮差先生最终会把邮件发送给你的收件人。 在这个比喻中&#xff0c;RabbitMQ是邮政信箱&a…

分类预测 | MATLAB实现1D-2D-CNN-GRU的多通道输入数据分类预测

分类预测 | MATLAB实现1D-2D-CNN-GRU的多通道输入数据分类预测 目录 分类预测 | MATLAB实现1D-2D-CNN-GRU的多通道输入数据分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 结合1D时序-2D图像多模态融合的CNN-GRU故障识别算法&#xff0c;基于一维时序信号和二维图…

火山引擎发布自研视频编解码芯片

2023年8月22日&#xff0c;火山引擎视频云宣布其自研的视频编解码芯片已成功出片。经验证&#xff0c;该芯片的视频压缩效率相比行业主流硬件编码器可提升30%以上&#xff0c;未来将服务于抖音、西瓜视频等视频业务&#xff0c;并将通过火山引擎视频云开放给企业客户。 火山引…

【redis问题】Caused by: io.netty.channel

遇到的问题&#xff1a; 在使用 RedisTemplate 连接 Redis 进行操作的时候&#xff0c;发生了如下报错&#xff1a; 测试代码为&#xff1a; 配置文件&#xff1a; 问题根源&#xff1a; redis没有添加端口映射解决方案&#xff1a; 删除原来的redis容器&#xff0c;添加新…

在Flutter应用内部实现分屏功能

前言 这一次被要求实现屏幕上同时展示两个页面&#xff0c;并且两个页面的逻辑&#xff0c;功能互不影响&#xff0c;通俗一点讲就是在Flutter内部实现一个类似于分屏的功能&#xff0c;这可难不倒我。 方法 要在 Flutter 中实现一个屏幕的上半部分和下半部分展示不同的页面…

分布式核心知识

文章目录 前言一、分布式中的远程调用1.1RESTful接口1.2RPC协议1.3区别与联系 二、分布式中的CAP原理 前言 关于分布式核心知识详解 一、分布式中的远程调用 在微服务架构中&#xff0c;通常存在多个服务之间的远程调用的需求。远程调用通常包含两个部分&#xff1a;序列化和通…

UWB高精度人员定位系统源码,微服务+java+ spring boot+ vue+ mysql技术开发

工业物联网感知预警体系&#xff0c;大中小企业工业数字化转型需求的工业互联网平台 工厂人员定位系统是指能够对工厂中的人员、车辆、设备等进行定位&#xff0c;实现对人员和车辆的实时监控与调度的系统&#xff0c;是智慧工厂建设中必不可少的一环。由于工厂的工作环境比较…