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

这篇具有很好参考价值的文章主要介绍了【QT5-自我学习-线程qThread练习-两种使用方式-1:通过继承线程类来使用-基础样例】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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
【QT5-自我学习-线程qThread练习-两种使用方式-1:通过继承线程类来使用-基础样例】,qt,工具使用,qt,学习,开发语言

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

自己也是参考他人文章,通过学习他人的文章与视频学习了qt多线程,当然要说明出处。
如下是博客地址,里面相关概念总结:https://subingwen.cn/qt/thread/
【QT5-自我学习-线程qThread练习-两种使用方式-1:通过继承线程类来使用-基础样例】,qt,工具使用,qt,学习,开发语言
如下是B站上视频,也是通过视频,敲的代码:https://www.bilibili.com/video/BV1iN411f7dY/?spm_id_from=333.337.search-card.all.click&vd_source=631b10b31b63df323bac39281ed4aff3
【QT5-自我学习-线程qThread练习-两种使用方式-1:通过继承线程类来使用-基础样例】,qt,工具使用,qt,学习,开发语言

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

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

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

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

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

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

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

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

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

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

4、实验过程

(0)实验目标

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

(1)新建工程

新建工程,是qtk开始的步骤,至少先让你的空白模块跑起来,如下,这里就不过多叙述了。
【QT5-自我学习-线程qThread练习-两种使用方式-1:通过继承线程类来使用-基础样例】,qt,工具使用,qt,学习,开发语言

(2)UI布局

我们需要是三个框,也就是listWidget,分别放置三个数组,一个是乱序数组,另外两个是冒泡排序和快排,如下。
【QT5-自我学习-线程qThread练习-两种使用方式-1:通过继承线程类来使用-基础样例】,qt,工具使用,qt,学习,开发语言

(3)线程类代码编写

虽然自己是看着他人资料,但是不想完全安装他人的,给自己增加些难度,分成了3个文件。
(1)添加新的文件,在项目上右键,然后选择“Add New…”
【QT5-自我学习-线程qThread练习-两种使用方式-1:通过继承线程类来使用-基础样例】,qt,工具使用,qt,学习,开发语言

(2)添加新的C++文件,然后命名,
【QT5-自我学习-线程qThread练习-两种使用方式-1:通过继承线程类来使用-基础样例】,qt,工具使用,qt,学习,开发语言

(3)这里可以先不选任何include,随后我们手头添加即可
【QT5-自我学习-线程qThread练习-两种使用方式-1:通过继承线程类来使用-基础样例】,qt,工具使用,qt,学习,开发语言

(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
【QT5-自我学习-线程qThread练习-两种使用方式-1:通过继承线程类来使用-基础样例】,qt,工具使用,qt,学习,开发语言

2、bublesort.cpp,这里在run中放入排序方式,使用双循环的冒泡,然后放入计时的,就是记录线程的函数。
【QT5-自我学习-线程qThread练习-两种使用方式-1:通过继承线程类来使用-基础样例】,qt,工具使用,qt,学习,开发语言
3、quicksort.h,快排头文件,一些函数声明等。
【QT5-自我学习-线程qThread练习-两种使用方式-1:通过继承线程类来使用-基础样例】,qt,工具使用,qt,学习,开发语言
4、quciksort.cpp,快排操作函数,这里库里只有相应函数,我们直接调用就好,就没按照参考文章里,再去实现一遍。
【QT5-自我学习-线程qThread练习-两种使用方式-1:通过继承线程类来使用-基础样例】,qt,工具使用,qt,学习,开发语言

(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、实际效果

实际效果如下,还是可以看到,不同算法,排序实际确实不是一样的。
【QT5-自我学习-线程qThread练习-两种使用方式-1:通过继承线程类来使用-基础样例】,qt,工具使用,qt,学习,开发语言

5-2、代码链接

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

6、细节部分

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

根据博主说明,要在main.cpp加入一段声明代码,否则会有错误。
【QT5-自我学习-线程qThread练习-两种使用方式-1:通过继承线程类来使用-基础样例】,qt,工具使用,qt,学习,开发语言
如下,如果注释掉,就会有问题。
【QT5-自我学习-线程qThread练习-两种使用方式-1:通过继承线程类来使用-基础样例】,qt,工具使用,qt,学习,开发语言

(2)拉姆达表达式

自己确实不是很深入了解,先学着使用吧,用起来之后,再慢慢理解。
【QT5-自我学习-线程qThread练习-两种使用方式-1:通过继承线程类来使用-基础样例】,qt,工具使用,qt,学习,开发语言
(3)用于计时线程的类,这个类还是挺方便的,可以帮我们计时,不过使用时,要注意包含,声明等。
【QT5-自我学习-线程qThread练习-两种使用方式-1:通过继承线程类来使用-基础样例】,qt,工具使用,qt,学习,开发语言

7、总结

一个模块的学习,会成为一块砖,成为你的垫脚石,或者一个建筑的一块砖。文章来源地址https://www.toymoban.com/news/detail-674113.html

到了这里,关于【QT5-自我学习-线程qThread练习-两种使用方式-1:通过继承线程类来使用-基础样例】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Qt】多线程QThread::run()与QObject::moveToThread()

    官方链接QThread Class | Qt Core 5.15.14 使用 QThread::run() 简单来说就是继承QThread类,并重写run()函数,这样run()函数中的代码就会运行在子线程中。 QThread对象管理着一个线程,并通过start函数启动这个线程,线程要执行的代码都在run()里面,run()函数的进入和返回,就相当于子线程的

    2024年02月08日
    浏览(40)
  • QT中Qthread线程彻底销毁的实例与注意事项(防止线程资源内存泄露)

     注意: 释放线程的时候触发线程的信号与槽连接时的连接类型参数一定要是Qt::ConnectionType::DirectConnection, 否则线程销毁不了会造成内存泄露,通过任务栏开启资源管理器可监视cup的线程数变化情况。 QThread* th=new QThread();           Work* mywork=new Work ();           mywork-move

    2024年02月02日
    浏览(47)
  • 13-1_Qt 5.9 C++开发指南_多线程及QThread 创建多线程程序_ThreadSignal

    一个应用程序一般只有一个线程,一个线程内的操作是顺序执行的,如果有某个比较消耗时间的计算或操作,比如网络通信中的文件传输,在一个线程内操作时,用户界面就可能会冻结而不能及时响应。这种情况下,可以创建一个单独的线程来执行比较消耗时间的操作,并与

    2024年02月14日
    浏览(45)
  • Qt+C++多线程thread-QThread-QTimer视频-控件动画-混合应用实例

    程序示例精选 Qt+C++多线程thread-QThread-QTimer混合应用实例 如需安装运行环境或远程调试,见文章底部个人 QQ 名片,由专业技术人员远程协助! 这篇博客针对Qt+C++多线程thread-QThread-QTimer混合应用实例编写代码,代码整洁,规则,易读。 学习与应用推荐首选。 功能:多线程thr

    2024年02月16日
    浏览(46)
  • Qt多线程使用的两种方式

    方式1 :继承自QThread类,重载run函数。此实现方法只有run()函数内的代码是运行在子线程内。 (不使用事件循环) 使用方法 : (1)run函数内有一个while或for的死循环(模拟耗时操作); (2)通过一个 标记位 来控制死循环的退出; (3)run()函数中无限循环记得 强制休息

    2023年04月10日
    浏览(44)
  • QT基础篇(12)QT5多线程

    在任何一门语言中,多线程都是一个相对其他方面比较重要的点,这里面的知识体系很庞大,同步和异步之间的处理方式,以及IO多路复用等等各种进行性能优化的方面,在往上层一点我们不可能一直进行系统层次的调用,这样太费时间也太麻烦,就到设计模式这里,比如反

    2024年01月22日
    浏览(39)
  • Qt5.14.2 Qt多线程实战演练,全面掌握线程同步和线程池最佳实践

    多线程编程是每个开发者必须掌握的基本能力之一。在上一篇文章中,我们学习了Qt多线程编程的理论知识。本文将切入实战,提供多个案例代码,帮助你彻底掌握Qt的多线程编程实践技巧。 案例1: 使用QThread执行耗时任务 这个案例演示了如何通过继承QThread和重写run()函数,在

    2024年03月20日
    浏览(39)
  • Qt QThread的moveToThread方法使用

    从 Qt4.4 版本之后,因为 QThread 的 run 方法创建新线程这样实现与 Qt 设计的理念不符,Qt 主推使用 moveToThread 方法来创建新线程。 QThread应该被看做是操作系统线程的接口或控制点,而不应该包含需要在新线程中运行的代码。需要运行的代码应该放到一个QObject的子类中,然后将

    2024年02月14日
    浏览(34)
  • 【QT5:CAN卡通信的上位机-代码练习-收发数据+布局+引用外部库+基础样例(1)】

    有句话叫做,出来还混,早晚是要还得,当时为快点使用完成can的qt上位机,偶然在网上找到一个样例,正好能运行,就直接拿着那个样例进行改了,后来上位机遇到点精准时间问题,一时间不知道如何调,正好也借着这个机会,学习一下样例代码,纯手打一遍。 实验环境还

    2024年02月01日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包