【QT5-自我学习-线程qThread练习-两种使用方式-2:通过继承Qobject类-自己实现功能函数方式-基础样例】
【QT5-自我学习-线程qThread练习-两种使用方式-2:通过继承Qobject类-自己实现功能函数方式-基础样例】
- 1、前言
- 2、实验环境
- 3-1、学习链接-参考文章
- 3-2、先前了解-自我总结
- (1)线程处理逻辑事件,不能带有主窗口的事件
- (2)一般考虑使用的时候,是当你发现,主窗口会有卡顿,需要线程在后台来处理。
- (1)通过继承QOject类这种方式-特点。
- 4、实验过程
- (0)实验目标
- (1)新建工程
- (2)UI布局
- (3)线程类代码编写
- (4)编写mainwindow.cpp内容。
- 5-1、实际效果
- 5-2、代码链接
- 6、细节部分
- (1)同样的,main.cpp加入一段声明代码。
- 7、总结
1、前言
学习线程其实有一段时间了,当时只是学习,没有实际用起来,最近做的一个qt程序,发现如果不使用线程,那么就会导致界面卡死,这样才体现出线程的实际作用。
这里是第二章,第二种实现线程方式,这个还是和继承线程类的方式不太一样的,两种本身没有优劣之分,看你使用场景与习惯。
2、实验环境
实验环境还是挺重要的,因为有时候,在你电脑上能运行的东西,在别人的电脑就不一定能运行,这一部分的原因就可能是实验版本不一样。
系统环境:window环境
QT软件版本:qt 5.14.2
ST-Link命令行工具的版本号:STM32 ST-LINK CLI v3.6.0.0

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烧写,并且文件很大的时候,主界面会直接卡住,才考虑使用,而不要是为了使用而使用,当你觉得主界面太卡,并且可以放在后台执行的时候,那么你就可以开一个线程。
(1)通过继承QOject类这种方式-特点。
1、对比继承线程类方式,这种一个显著特定,没有run这个函数了,你自己写自定义函数,到时候直接调用就可以了。
2、编写自定义函数内容
我们很多时候,是先学习怎么去做,然后返回来在具体了解内部细节的。
4、实验过程
(0)实验目标
采用两种不同速度排序的方式,对一个乱序的数组进行排序,这个过程中,需要生产乱序数组,使用一个线程,两种排序需要使用两个线程,所有一种有3个线程。
(1)新建工程
新建工程,是qtk开始的步骤,至少先让你的空白模块跑起来,如下,这里就不过多叙述了(这里直接使用之前图片了)。

(2)UI布局
我们需要是三个框,也就是listWidget,分别放置三个数组,一个是乱序数组,另外两个是冒泡排序和快排,如下。

(3)线程类代码编写
本工程就不在分太多文件了,只是添加一个线程文件,将三个线程写在一起。
(1)添加新的文件,在项目上右键,然后选择“Add New…”

(2)添加新的C++文件,然后命名,

(3)这里可以先选上include QObject,细节代码,我们稍后添加。

(4)编写对于”mythread.h“和“mythread.cpp”内容。
我们需要继承QObject类,编写功能函数声明,自定义函数声明的,如下代码快,
#ifndef MYTHREAD_H
#define MYTHREAD_H#include <QObject>
#include <QThread>
#include <QVector>
#include <QDebug>class myThread_rand : public QObject
{Q_OBJECT
public:explicit myThread_rand(QObject *parent = nullptr);void working(int num);signals:void sendArray(QVector<int> num);};class bubblesort_thread : public QObject
{Q_OBJECT
public:explicit bubblesort_thread(QObject *parent = nullptr);void working(QVector<int> list);signals:void finish(QVector<int> num);};class quickSort_thread : public QObject
{Q_OBJECT
public:explicit quickSort_thread(QObject *parent = nullptr);
//任务函数void working(QVector<int> list);signals:void finish(QVector<int> num);};#endif // MYTHREAD_H
“mythread.cpp”内容,主要是实现相应函数内容,具体实现内容,这里也直接给出代码块。
#include "mythread.h"
#include <QElapsedTimer>
#include <QThread>using namespace std;myThread_rand::myThread_rand(QObject *parent) : QObject(parent)
{}bubblesort_thread::bubblesort_thread(QObject *parent) : QObject(parent)
{}quickSort_thread::quickSort_thread(QObject *parent) : QObject(parent)
{}void myThread_rand::working(int num)
{qDebug() << "生成随机数的线程地址为:" << QThread::currentThread() << endl;QVector<int> list;QElapsedTimer time;time.start();for(int i=0;i<num;++i){list.push_back(qrand()%10000);}int milsec = time.elapsed();qDebug() << "生成" << num<< "个随机总数用时:"<< milsec <<"毫秒" <<endl;emit sendArray(list);
}void bubblesort_thread::working(QVector<int> list)
{qDebug() << "冒泡生成的线程地址为:" << QThread::currentThread() << endl;QElapsedTimer time;time.start();// QVector<int> list;int temp;for(int i=0;i<list.size();++i){for(int j=0;j<list.size()-i-1;++j){if(list[j]>list[j+1]){temp=list[j];list[j]=list[j+1];list[j+1]=temp;}}}int milsec = time.elapsed();qDebug() << "冒泡总数用时:"<< milsec <<"毫秒" <<endl;emit finish(list);
}void quickSort_thread::working(QVector<int> list)
{qDebug() << "快速排序的线程地址为:" << QThread::currentThread() << endl;QElapsedTimer time;time.start();// QVector<int> list;std::sort(list.begin(),list.end());int milsec = time.elapsed();qDebug() << "快速排序总数用时:"<< milsec <<"毫秒" <<endl;emit finish(list);
}
(4)编写mainwindow.cpp内容。
这里的工作,主要是创建子线程,并传递数据,具体可以直接参照代码。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QThread>
#include "mythread.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//1.创建子线程QThread* t1 = new QThread;QThread* t2 = new QThread;QThread* t3 = new QThread;//2.创建任务类的对象myThread_rand* gen = new myThread_rand;bubblesort_thread* bubble = new bubblesort_thread;quickSort_thread* quick = new quickSort_thread;//3.将任务对象转移到每个子线程中gen->moveToThread(t1);bubble->moveToThread(t2);quick->moveToThread(t3);//4 按下按键 启动随机数线程connect(ui->pushButton,&QPushButton::clicked,this,[=](){emit starting(10000);t1->start();});//5 连接到产生随机数据函数,开始产生随机数据connect(this,&MainWindow::starting,gen,&myThread_rand::working);connect(gen,&myThread_rand::sendArray,bubble,&bubblesort_thread::working);connect(gen,&myThread_rand::sendArray,quick,&quickSort_thread::working);connect(gen,&myThread_rand::sendArray,this,[=](QVector<int> list){t2->start();t3->start();for(int i=0;i<list.size();++i){ui->listWidget_rand->addItem(QString::number(list.at(i)));}});connect(bubble,&bubblesort_thread::finish,this,[=](QVector<int> list){for(int i=0;i<list.size();++i){ui->listWidget_bubblesort->addItem(QString::number(list.at(i)));}});connect(quick,&quickSort_thread::finish,this,[=](QVector<int> list){for(int i=0;i<list.size();++i){ui->listWidget_quicksort->addItem(QString::number(list.at(i)));}});
}MainWindow::~MainWindow()
{delete ui;
}
5-1、实际效果
实际效果如下,还是可以看到,不同算法,排序实际确实不是一样的。

5-2、代码链接
代码链接:https://download.csdn.net/download/qq_22146161/88245843
6、细节部分
(1)同样的,main.cpp加入一段声明代码。
根据博主说明,要在main.cpp加入一段声明代码,否则会有错误。

7、总结
这里只是实现不一样,所有文章很多部分和第一篇有些类似。后续会加入一篇讲解关于移植部分。
相关文章:
【QT5-自我学习-线程qThread练习-两种使用方式-2:通过继承Qobject类-自己实现功能函数方式-基础样例】
【QT5-自我学习-线程qThread练习-两种使用方式-2:通过继承Qobject类-自己实现功能函数方式-基础样例】 1、前言2、实验环境3-1、学习链接-参考文章3-2、先前了解-自我总结(1)线程处理逻辑事件,不能带有主窗口的事件(2&…...
两款开箱即用的Live2d
目录 背景第一款:开箱即用的Live2d在vue项目中使用html页面使用在线预览依赖文件地址配置相关参数成员属性源码 模型下载 第二款:换装模型超多的Live2d在线预览代码示例源码 模型下载 背景 从第一次使用服务器建站已经三年多了,记得那是在2…...
LAMP架构详解+构建LAMP平台之Discuz论坛
LAMP架构详解构建LAMP平台之Discuz论坛 1、LAPM架构简介1.1动态资源与语言1.2LAPM架构得组成1.3LAPM架构说明1.4CGI和astcgi1.4.1CGI1.4.2fastcgi1.4.3CGI和fastcgi比较 2、搭建LAMP平台2.1编译安装apache httpd2.2编译安装mysql2.3编译安装php2.4安装论坛 1、LAPM架构简介 1.…...
如何使用腾讯云服务器搭建网站?新手建站教程
使用腾讯云服务器搭建网站全流程,包括轻量应用服务器和云服务器CVM建站教程,轻量可以使用应用镜像一键建站,云服务器CVM可以通过安装宝塔面板的方式来搭建网站,腾讯云服务器网分享使用腾讯云服务器建站教程,新手站长搭…...
mybatis plus 控制台和日志文件中打印sql配置
1 控制台输出sql 配置mybatis-plus的日志实现类为StdOutImpl,该实现类中打印日志是通过System.out.println(s)的方式来打印日志的 mybatis-plus:configuration:log-impl: org.apache.imbatis.logging.stdout.StdOutImpl2 日志文件中写入sql 日志文件中输入sql需要…...
苍穹外卖总结
前言 1、软件开发流程 瀑布模型需求分析//需求规格说明书、产品原型↓ 设计 //UI设计、数据库设计、接口设计↓编码 //项目代码、单元测试↓ 测试 //测试用例、测试报告↓上线运维 //软件环境安装、配置第一阶段:需求分析需求规格说明书、产品原型一般来说…...
Git 删除已经合并的本地分支
在使用 Git 的开发流程中,经常会创建很多的 Git 分支,包括功能分支(features/*)、发布分支(release/*)和 hotfix 分支(hotfix/*)。在开发了一段时间之后,本地就会有出现很…...
递归算法应用(Python版)
文章目录 递归递归定义递归调用的实现递归应用数列求和任意进制转换汉诺塔探索迷宫找零兑换-递归找零兑换-动态规划 递归可视化简单螺旋图分形树:自相似递归图像谢尔宾斯基三角 分治策略优化问题和贪心策略 递归 递归定义 递归是一种解决问题的方法,其精…...
有什么react进阶的项目推荐的?
前言 整理了一些react相关的项目,可以选择自己需要的练习,希望对你有帮助~ 1.ant-design Star:87.1k 阿里开源的react项目,作为一个UI库,省去重复造轮子的时间 仓库地址:https://github.com/ant-design/…...
基于串口透传模块,单片机无线串口空中下载测试
基于串口透传模块,单片机无线串口空中下载测试 ✨无线串口下载,其本质还是串口下载方式,只不过省去了单片机和ISP上位机工具之间的物理有线连接,中间的数据通过无线串口透传模块进行数据中转,传递到单片机串口上。串口…...
研磨设计模式day11代理模式
目录 场景 代码实现 编辑 解析 定义 代理模式调用示意图 代理模式的特点 本质 编辑何时选用 场景 我有一个订单类,包含订单数、用户名和商品名,有一个订单接口包含了对订单类的getter和setter 现在有一个需求,a创建的订单只…...
vue2 路由进阶,VueCli 自定义创建项目
一、声明式导航-导航链接 1.需求 实现导航高亮效果 如果使用a标签进行跳转的话,需要给当前跳转的导航加样式,同时要移除上一个a标签的样式,太麻烦!!! 2.解决方案 vue-router 提供了一个全局组件 router…...
《C语言编程环境搭建》工欲善其事 必先利其器
C语言编译器 GCC 系列 GNU编译器套装(英语:GNU Compiler Collection,缩写为GCC),指一套编程语言编译器,常被认为是跨平台编译器的事实标准。原名是:GNU C语言编译器(GNU C Compiler)。 MinGW 又称mingw32 ,…...
蓝蓝设计ui设计公司作品案例-中节能现金流抗压测试软件交互及界面设计
中国节能是以节能环保为主业的中央企业。中国节能以生态文明建设为己任,长期致力于让天更蓝、山更绿、水更清,让生活更美好。经过多年发展,中国节能已构建起以节能、环保、清洁能源、健康和节能环保综合服务为主业的41产业格局,成…...
汽车制造业外发文件时 如何阻断泄密风险?
汽车制造业是我国国民经济发展的支柱产业之一,具有产业链长、关联度高、就业面广、消费拉动大等特性。汽车制造行业景气度与宏观经济、居民收入水平和固定资产投资密切相关。 汽车制造业产业链长,关联度高,汽车制造上游行业主要为钢铁、化工…...
怎么对App进行功能测试
测试人员常被看作是bug的寻找者,但你曾想过他们实际是如何开展测试的吗?你是否好奇他们究竟都做些什么,以及他们如何在一个典型的技术项目中体现价值?本文将带你经历测试人员的思维过程,探讨他们测试app时的各种考虑. …...
数字流的秩、单词频率(哈希实现)
题目1:数字流的秩 假设你正在读取一串整数。每隔一段时间,你希望能找出数字 x 的秩(小于或等于 x 的值的个数)。请实现数据结构和算法来支持这些操作,也就是说: 实现 track(int x) 方法,每读入一个数字都会调用该方法…...
【洛谷】P2678 跳石头
原题链接:https://www.luogu.com.cn/problem/P2678 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 二分答案。(使用二分需要满足两个条件。一个是有界,一个是单调。 这题的题面:使得选手们在比赛过程中…...
Elasticsearch配置优化
以下的优化基础是安装的 Elasticsearch 版本为 7.17.7,同时jdk版本为 1.8.321 1、jvm参数优化 这里说的jvm参数调优,是指elasticsearch安装目录下的jvm.options配置,如下图所示: 这里调整的内容主要是调整垃圾回收的收集器&#…...
Springboot整合minio组件-分布式文件存储
一、快速开始 Minlo说明: Minio是Apcche旗下的一款开源的轻量级文件服务器,基于对象存储,协议是基于Apache License v2.0,开源可用于商务。Minio主要用来存储非结构化的数据,类似文件,图片,照…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...
当下AI智能硬件方案浅谈
背景: 现在大模型出来以后,打破了常规的机械式的对话,人机对话变得更聪明一点。 对话用到的技术主要是实时音视频,简称为RTC。下游硬件厂商一般都不会去自己开发音视频技术,开发自己的大模型。商用方案多见为字节、百…...
