【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、总结

这里只是实现不一样,所有文章很多部分和第一篇有些类似。后续会加入一篇讲解关于移植部分。

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

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

相关文章

4G模组EC20 网卡udhcpc获取IP但是没有设置IP

使能网卡&#xff1a; ifconfig usb0 up dhcp获取ip&#xff0c;虽然没有报error&#xff0c;但是很显然没有设置进配置 获取ip命令&#xff1a;udhcpc -i usb0 非正常现象&#xff1a; 正常现象&#xff1a; 解决方法&#xff1a; &#xff08;1&#xff09;rootfs 创建文件夹…

lvs-DR模式:

lvs-DR数据包流向分析 客户端发送请求到 Director Server&#xff08;负载均衡器&#xff09;&#xff0c;请求的数据报文&#xff08;源 IP 是 CIP,目标 IP 是 VIP&#xff09;到达内核空间。 Director Server 和 Real Server 在同一个网络中&#xff0c;数据通过二层数据链路…

安卓主板定制_电磁屏/电容屏安卓平板基于MTK联发科方案定制

定制化行业平板 在各行各业中的地位越来越重要&#xff0c;甚至在行业转型和发展中发挥着不可替代的作用。随着工业化社会的快速发展&#xff0c;工业生产对智控设备要求越来越高&#xff0c;运用的范畴也越来越普遍广泛&#xff0c;工业级平板就是其中一种应用广泛的设备。 新…

字节一面:post为什么会发送两次请求?

前言 最近博主在字节面试中遇到这样一个面试题&#xff0c;这个问题也是前端面试的高频问题&#xff0c;因为在前端开发的日常开发中我们总是会与post请求打交道&#xff0c;一个小小的post请求也是牵扯到很多知识点的&#xff0c;博主在这给大家细细道来。 &#x1f680; 作者…

python爬虫实战(3)--爬取某乎热搜

1. 分析爬取地址 打开某乎首页&#xff0c;点击热榜 这个就是我们需要爬取的地址&#xff0c;取到地址某乎/api/v3/feed/topstory/hot-lists/total?limit50&desktoptrue 定义好请求头&#xff0c;从Accept往下的请求头全部复制&#xff0c;转换成json headers {Accep…

Levels - 场景参考:山脉景观(Landscape Mountains)

一些从前的笔记的归档&#xff0c;记录了一些UE4资产的相关信息&#xff1b; 山脉景观&#xff08;Landscape Mountains&#xff09;&#xff1a; 项目的地形材质比较复杂&#xff0c;有几个比较重要的大效果功能&#xff0c;一个是沉积岩的效果&#xff1a; 沉积岩效果的功能…

保研面试题复习

信源/信道编码的目的和种类&#xff1f; 这个图是每个人在学习通信原理的时候&#xff0c;都会遇到的图。包含了三要素&#xff1a;信源、信道和信宿。这个图直接可以回答最开始的问题&#xff0c;所谓信源编码就是针对信源编码&#xff0c;所谓信道编码就是针对信道编码。 有…

python 使用 pdf2image 库将PDF转换为图片

python 使用 pdf2image 库将PDF转换为图片 初环境步骤一&#xff1a;安装pdf2image库步骤二&#xff1a;导入必要的库步骤三&#xff1a;指定PDF文件路径步骤四&#xff1a;将PDF转换为图片步骤五&#xff1a;保存图像为图片文件完整代码运行结果 在数字化时代&#xff0c;PDF&…

如何在 Ubuntu 中安装最新的 Python 版本

动动发财的小手&#xff0c;点个赞吧&#xff01; Python 是增长最快的主要通用编程语言。其原因有很多&#xff0c;例如其可读性和灵活性、易于学习和使用、可靠性和效率。 目前使用的 Python 有两个主要版本 – 2 和 3&#xff08;Python 的现在和未来&#xff09;&#xff1…

Linux下的系统编程——makefile入门(四)

前言&#xff1a; 或许很多Winodws的程序员都不知道这个东西&#xff0c;因为那些Windows的IDE都为你做了这个工作&#xff0c;但我觉得要作一个好的和professional的程序员&#xff0c;makefile还是要懂。这就好像现在有这么多的HTML的编辑器&#xff0c;但如果你想成为一个专…

【业务功能篇74】三高微服务项目springboot-springcloud

三高指的是&#xff1a;高性能、高并发、高可用 2.项目架构 2.1 系统架构图 整体的项目架构图如下 2.2 业务组成 整体的项目业务组成如下

Python 密码破解指南:10~14

协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【OpenDocCN 饱和式翻译计划】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 收割 SB 的人会被 SB 们封神&#xff0c;试图唤醒 SB 的人是 SB 眼中的 SB。——SB 第三定律 十、加…

VSCode 如何解决 scanf 的输入问题——Code is already running!

文章如何使用 VSCode 软件运行C代码中已经介绍了如何在 VSCode 软件中运行C代码&#xff0c;但最近在使用 scanf 想从键盘输入时&#xff0c;运行代码后显示“Code is already running!”&#xff0c;如下图所示&#xff0c;在输出窗口是无法通过键盘输入的。 解决办法如下&am…

Qt 阴影边框

阴影边框很常见&#xff0c;诸如360以及其他很多软件都有类似效果&#xff0c;了解CSS3的同学们应该都知道box-shadow&#xff0c;它就是来设定阴影效果的&#xff0c;那么Qt呢&#xff1f;看过一些资料&#xff0c;说是QSS是基于CSS2的&#xff0c;既然如此&#xff0c;box-sh…

【核磁共振成像】方格化重建

目录 一、缩放比例二、方格化变换的基础三、重建时间四、方格化核 一、缩放比例 对于笛卡尔K空间直线轨迹数据可直接用FFT重建&#xff0c;而如果K空间轨迹的任何部分都是非均匀取样的 可用DFT直接重建&#xff0c;有时称为共轭相位重建&#xff0c;但此法太慢不实用。把数据再…

window如何实时刷新日志文件

1 安装windows git 下载地址&#xff1a;Git - Downloading Package (git-scm.com) 2 打开git bash 输入tail.exe -f 日志文件路径

CSS3盒模型+flex

1.盒模型 标准盒模型: wwidthpaddingborderhheightpaddingborder 怪异盒模型(ie盒模型) wwidth包含了(paddingborder)hheight包含了(paddingborder) 2.CSS3弹性盒(重点新版弹性盒) 弹性盒: 设置为弹性盒后,父元素为容器,子元素为项目弹性盒中存在两根轴,默认水平为主轴,垂…

浅谈APP自动化测试工具的优势和应用

随着移动应用市场的迅速发展&#xff0c;APP的质量和性能变得至关重要。为了确保APP的稳定性和用户体验&#xff0c;自动化测试工具成为开发者和测试团队的关键利器。那么&#xff0c;APP自动化测试工具的优势和应用是什么?下面&#xff0c;就跟随掌控智能小编一起来看看具体介…

LeetCode——二叉树篇(九)

刷题顺序及思路来源于代码随想录&#xff0c;网站地址&#xff1a;https://programmercarl.com 目录 669. 修剪二叉搜索树 108. 将有序数组转换为二叉搜索树 538. 把二叉搜索树转换为累加树 669. 修剪二叉搜索树 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界…

【Jetpack】Navigation 导航组件 ④ ( Fragment 跳转中使用 safe args 安全传递参数 )

文章目录 一、页面跳转间的传统的数据传递方式1、传统的数据传递方式 - Bundle 传递数据1、Navigation 组件中的 Bundle 数据传递2、传统数据传递实现步骤3、FragmentA 完整代码示例4、FragmentB 完整代码示例5、执行结果 2、使用 Bundle 传递数据安全性差 二、页面跳转间的传统…