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

news2024/11/24 20:04:22

【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.coloradmin.cn/o/914404.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Debootstrap 教程

文章目录 Debootstrap 教程安装 debootstrap使用 debootstrap运行 debootstrap进入新的系统结束语 Debootstrap 教程 debootstrap 是一个用于在 Debian-based 系统上创建一个基本的 Debian 系统的工具。它可以用于创建 chroot 环境、容器或者为新的系统安装做准备。 安装 deb…

数学建模-模型详解(2)

微分模型 当谈到微分模型时&#xff0c;通常指的是使用微分方程来描述某个系统的动态行为。微分方程是描述变量之间变化率的数学方程。微分模型可以用于解决各种实际问题&#xff0c;例如物理学、工程学、生物学等领域。 微分模型可以分为两类&#xff1a;常微分方程和偏微分…

基于Linux操作系统中的shell脚本

目录 前言 一、概述 1、什么是shell&#xff1f; 2、shell脚本的用途有哪些&#xff1f; 3、常见的shell有哪些&#xff1f; 4、学习shell应该从哪几个方面入手&#xff1f; 4.1、表达式 1&#xff09;变量 2&#xff09;运算符 4.2、语句 1&#xff09;条件语句&am…

【LeetCode-中等题】3. 无重复字符的最长子串

题目 题解一&#xff1a;单指针&#xff0c;滑动窗口 思路&#xff1a; 设置一个左指针&#xff0c;来判断下一个元素是否在set集合中&#xff0c;如果不在&#xff0c;就加入集合&#xff0c;right继续&#xff0c;如果在&#xff0c;就剔除重复的元素&#xff0c;计算串的长度…

C++笔记之设计模式:setter函数、依赖注入

C笔记之设计模式&#xff1a;setter函数、依赖注入 code review! 文章目录 C笔记之设计模式&#xff1a;setter函数、依赖注入1.概念2.基本示例3.setter函数4.基本示例setter函数构成依赖注入5.概念——ChatGpt6.构造函数注入示例7.接口注入示例8. 构造函数注入的使用场景和用…

【C++】早绑定、析构与多态 | 一道关于多态的选择题记录

今天在和群友聊天的时候看到了一道很坑的题目&#xff0c;分享给大家 1.看题&#xff01; 先来看看题目 struct Dad { public:Dad(){ echo();}~Dad(){ echo();}virtual void echo() {cout << "DAD ";} };struct Son:Dad { public:void echo() const override…

ARM,(cortex-A7核中断实验)

1.实验目的&#xff1a;实现KEY1/LEY2/KE3三个按键&#xff0c;中断触发打印一句话&#xff0c;并且灯的状态取反&#xff1b; key1 ----> LED3灯状态取反&#xff1b; key2 ----> LED2灯状态取反&#xff1b; key3 ----> LED1灯状态取反&#xff1b; 2.分析框图: …

<深度学习基础> 激活函数

为什么需要激活函数&#xff1f;激活函数的作用&#xff1f; 激活函数可以引入非线性因素&#xff0c;可以学习到复杂的任务或函数。如果不使用激活函数&#xff0c;则输出信号仅是一个简单的线性函数。线性函数一个一级多项式&#xff0c;线性方程的复杂度有限&#xff0c;从…

vue3 01-setup函数

1.setup函数的作用: 1.是组合式api的入口2.比beforeCreate 执行更早3.没有this组件实例一开始创建vue3页面的时候是这样的 <template></template> <script> export default{setup(){return{ }} } </script>给容器传参在页面中显示 数据给模板使用,以…

【C语言】位段,枚举和联合体详解

目录 1.位段 1.1 什么是位段 1.2 位段的内存分配 1.3 位段的跨平台问题 2.枚举 2.1 枚举类型的定义 2.2 枚举的优点 3. 联合&#xff08;共用体&#xff09; 3.1 联合类型的定义 3.2 联合的特点 3.3 联合大小的计算 1.位段 1.1 什么是位段 位段的声明和结构体是类…

基于ECharts+flask的爬虫可视化

项目效果。 本案例基于python的flask框架&#xff0c;通过爬虫程序将数据存储在csv文件中&#xff0c;在项目运行时会通过render_template映射出对应的页面&#xff0c;并且触发一个函数&#xff0c;该函数会读取csv文件的数据将之交给echarts渲染 &#xff0c;echarts将之渲染…

线性代数的学习和整理---番外1:EXCEL里角度,弧度,三角函数

目录 1 角的度量&#xff1a;角度和弧度 1.1 角度 angle 1.1.1 定义 1.1.2 公式 1.1.2 角度取值范围 1.2 弧长和弦长 1.3 弧度 rad 1.3.1 弧长和弧度定义的原理 1.3.2 定义 1.3.3 取值范围 1.3.4 取值范围 1.4 角度&#xff0c;弧度的换算 1.5 EXCEL里进行角度和…

Red Hat Enterprise Linux (RHEL) 6.4 安装、redhat6.4安装

1、下载地址 Red Hat Enterprise Linux (RHEL) 6.4 DVD ISO 迅雷下载地址http://rhel.ieesee.net/uingei/rhel-server-6.4-x86_64-dvd.iso 2、创建虚拟机 3、redhat安装 选择第一个安装 Skip跳过检查 语言选择简体中文 键盘选择默认 选择基本存储设备 忽略所有数据 设置root密…

Ribbon:listOfServers

解释&#xff1a; 配置了address的地址,请求会走address&#xff0c;也就是http://127.0.0.1:8081&#xff0c;通常用户与别的后端服务进行联调设置为其本地服务的ip。 如果将address:注释掉。 会走后面的XXX.feign.default-server地址&#xff0c;这个地址通常可以配一个网关…

基于Spring Boot的智慧团支部建设网站的设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的智慧团支部建设网站的设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java sp…

【动手学深度学习】--18.图像增广

文章目录 图像增广1.常用的图像增广方法1.1翻转和裁剪1.2改变颜色1.3结合多种图像增广方法 2.使用图像增广进行训练3.训练 图像增广 官方笔记&#xff1a;图像增广 学习视频&#xff1a;数据增广【动手学深度学习v2】 图像增广在对训练图像进行一系列的随机变化之后&#xff…

开发一个npm组件包

vue项目初始化 vue create mytest 启动项目以后 组件开发 开发的组件写在 package中 如下如例 开发一个 listpage的组件 里面放了一个a链接注册组件配置打包 "package": "vue-cli-service build --target lib ./src/package/index.js --name managerpage -…

linux 免交互

Linux 免交互 1、免交互概念2、基本免交互的例子2.1命令行免交互统计2.2使用脚本免交互统计2.3使用免交互命令打印2.4免交互修改密码2.5重定向查看2.6重定向到指定文件2.7重定向直接指定文件2.8使用脚本完成重定向输入2.9免交互脚本完成赋值变量2.10关闭变量替换功能&#xff0…

一分钟学算法-递归-斐波那契数列递归解法及优化

一分钟学一个算法题目。 今天我们要学习的是用递归算法求解斐波那契数列。 首先我们要知道什么是斐波那契数列。 斐波那契数列&#xff0c;又称黄金分割数列&#xff0c;是一个经典的数学数列&#xff0c;其特点是第一项&#xff0c;第二项为1&#xff0c;后面每个数字都是前…

linux iptables安全技术与防火墙

linux iptables安全技术与防火墙 1、iptables防火墙基本介绍1.1netfilter/iptables关系1.2iptables防火墙默认规则表、链结构 2、iptables的四表五链2.1四表2.2五链2.3四表五链总结2.3.1 规则链之间的匹配顺序2.3.2 规则链内的匹配顺序 3、iptables的配置3.1iptables的安装3.2i…