【QT5-自我学习-线程qThread练习-两种使用方式-2:通过继承Qobject类-自己实现功能函数方式-基础样例】

news2024/12/24 8:40:36

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

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

相关文章

攻防世界-base÷4

原题 解题思路 base644&#xff0c;莫不是base16&#xff0c;base16解码网站&#xff1a; 千千秀字

k8s 安装istio (一)

前置条件 已经完成 K8S安装过程十&#xff1a;Kubernetes CNI插件与CoreDNS服务部署 部署 istio 服务网格与 Ingress 服务用到了 helm 与 kubectl 这两个命令行工具&#xff0c;这个命令行工具依赖 ~/.kube/config 这个配置文件&#xff0c;目前只在 kubernetes master 节点中…

postgres数据常用SQL语句

-- 系统信息函数 select version(),user,current_user; -- 创建表 CREATE TABLE biao(id INT primary key,name VARCHAR(25) not null,sex VARCHAR(25) unique,salary FLOAT default 9000 ); -- 更换表名 ALTER TABLE biaoRename to biao1; -- 更换字段类型 ALTER TABLE biao1 …

Tushare入门小册

Tushare入门小册 一、Tushare平台介绍 Pro版数据更稳定质量更好了&#xff0c;我们提供的不再是直接从互联网抓取&#xff0c;而是通过社区的采集和整理存入数据库经过质量控制后再提供给用户。但Pro依然是个开放的&#xff0c;免费的平台&#xff0c;不带任何商业性质和目的…

红黑树的调整图解

讲的很好 的红黑树原理 上面的视频讲解的红黑树很好。尤其是关于红黑树的调整。画图做了下总结&#xff0c;谢谢。

AVL——平衡搜索树

✅<1>主页&#xff1a;我的代码爱吃辣&#x1f4c3;<2>知识讲解&#xff1a;数据结构——AVL树☂️<3>开发环境&#xff1a;Visual Studio 2022&#x1f4ac;<4>前言&#xff1a;AVL树是对二叉搜索树的严格高度控制&#xff0c;所以AVL树的搜索效率很高…

微服务中间件--统一网关Gateway

统一网关Gateway 8.统一网关Gatewaya.搭建网关服务b.路由断言工厂c.路由过滤器GatewayFilterd.全局过滤器GlobalFiltere.过滤器的执行顺序f.网关的cors跨域配置 8.统一网关Gateway 网关功能&#xff1a; 身份认证和权限校验服务路由、负载均衡请求限流 网关的技术实现 在Spr…

基于大数据+django+mysql的银行信用卡用户的数仓系统

系统阐述的是银行信用卡用户的数仓系统的设计与实现&#xff0c;对于Python、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计&#xff0c;描述&#xff0c;实现和分析与测试方面来表明开发的过程。开发中使用了 django框架和MySql数据库技术搭建系统的整体架构…

国民新旅游时代拉开大幕,OTA平台迎来新红利和新任务

高温轮番而至&#xff0c;这个燥热的夏天&#xff0c;旅游业也躁动不已。 上半年是旅游业丰收的半年&#xff0c;各地旅游盛况频上热搜。文旅部公布的旅游数据显示&#xff0c;2023年上半年&#xff0c;国内旅游总人次23.84亿&#xff0c;同比增长63.9%&#xff1b;国内旅游收…

IO day 7

1、使用消息队列完成两个进程间相互通信 msgsnd #include <myhead.h>typedef struct {long msgtype;char data[1024]; }Msg_ds;#define SIZE sizeof(Msg_ds)-sizeof(long)int main(int argc, const char *argv[]) {//创建key值key_t key;if((key ftok("/",k…

Feign:使用接口方式调用服务

创建一个新的消费者模块并导入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://ma…

创建k8s operator

目录 1.前提条件 2.进一步准备 2.1.安装golang 2.2.安装code&#xff08;vscode的linux版本&#xff09; 2.3.安装kubebuilder 3.开始创建Operator 3.1.什么是operator? 3.2.GV & GVK & GVR 3.3.创建operator 3.3.1. 生成工程框架 3.3.2.生成api(GVK) …

C++设计模式之适配器模式

一、适配器模式 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;用于将一个类的接口转换成另一个类所期望的接口&#xff0c;以便两个类能够协同工作。 适配器模式可以解决现有类接口与所需接口不匹配的问题&#xff0c;使得原本因接口不…

JavaScript下载excel文件

文章目录 通过链接下载a标签下载方法注意 获取文件流请求体配置下载文件流 总结 通过链接下载 a标签 对于已知地址的目标文件&#xff0c;前端可以使用 a标签 来直接下载&#xff0c;使用a标签下载使用到两个属性 download&#xff1a;下载文件名href&#xff1a;目标文件下…

ORA-01174: DB_FILES be compatible RAC rolling fashion complete outage

How to change the DB_FILES parameter in RAC (Doc ID 1636681.1)​编辑To Bottom In this Document Goal Solution APPLIES TO: Oracle Database - Enterprise Edition - Version 10.1.0.2 and later Oracle Database Cloud Schema Service - Version N/A and later Oracle…

【业务功能篇75】微服务项目环境搭建docker-mysql-redisSpringCloudAlibaba

项目环境准备 1.虚拟机环境 我们可以通过VMWare来安装&#xff0c;但是通过VMWare安装大家经常会碰到网络ip连接问题&#xff0c;为了减少额外的环境因素影响&#xff0c;Docker内容的讲解我们会通过VirtualBox结合Vagrant来安装虚拟机。 VirtualBox官网&#xff1a;https:/…

《热题101》链表篇

思路&#xff1a;之前有反转链表前n个值、以及反转指定区间的链表&#xff0c;所以这个我只想在这两个基础上实现。用左右指针来确定当前反转的区间&#xff0c;每次反转之前都检查一下当前区间是否足够k&#xff0c;即区间之后的节点cur&#xff0c;足够就可以反转&#xff0c…

【Flink】Flink架构及组件

我们学习大数据知识的时候&#xff0c;需要知道大数据组件如何安装以及架构组件&#xff0c;这将帮助我们更好的了解大数据组件 对于大数据Flink&#xff0c;架构图图下&#xff1a; 整个架构图有三种关键组件 1、Client&#xff1a;负责作业的提交。调用程序的 main 方法&am…

基于乌鸦算法优化的BP神经网络(预测应用) - 附代码

基于乌鸦算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于乌鸦算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.乌鸦优化BP神经网络2.1 BP神经网络参数设置2.2 乌鸦算法应用 4.测试结果&#xff1a;5.Matlab代码 摘要…

Spring练习31---用户添加操作--添加数据到数据库,最终添加讲师,助教操作最终完毕

视频链接&#xff1a;16-Spring练习-用户添加操作-添加数据到数据库_哔哩哔哩_bilibili 104 1、当你点击提交时&#xff0c;form表单进行提交 2、这个名字必须跟你当前封装的属性名一样 3、要封装跟user的属性名一样&#xff0c;这样springMVc才能自动封装进去 4、提交时选择r…