当前位置: 首页 > article >正文

【QT线程学习】

QT学习点滴积累之线程二

  • Qt线程

Qt线程

Qt线程比较难掌握,一般都会说到两种使用方式 重载QThread,重写Run,重载QObject,MovetoThread,重写started槽函数网络文章也很多,罗列一些浏览过的网文供参考。
QT大佬的怒吼
两种使用实例
线程同步
线程还有很多内容,除了上面提到的外,还有QRunable,QFuture,线程池等等,小编也搞不懂,想从应用的角度去模拟出来一种或者两种模式。
从应用场景看,线程大概会出现如下场景:
运行耗时运算,通讯发送完等待返回,平时休眠触发运行,时间片运行。
未完待续,后面陆续记录下来。

上一篇学习了使用QObject,这一章记录继承QThread的学习内容。
还是以两种使用实例提供的例子进行学习,后面提供修改验证的例子。

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QThread>

class MyThread : public QThread
{
    Q_OBJECT
public:
    explicit MyThread(QObject *parent = nullptr);

protected:
    void run();

signals:
    // 自定义信号, 传递数据
    void curNumber(int num);

public slots:
};

#endif // MYTHREAD_H


#include "mythread.h"
#include <QDebug>

MyThread::MyThread(QObject *parent) : QThread(parent)
{

}

void MyThread::run()
{
    qDebug() << "当前线程对象的地址: " << QThread::currentThread();

    int num = 0;
    while(1)
    {
        emit curNumber(num++);
        if(num == 10000000)
        {
            break;
        }
        QThread::usleep(1);
    }
    qDebug() << "run() 执行完毕, 子线程退出...";
}

这里的退出run函数,是否和前面一样没有退出线程呢?
我们和前面一样,添加一个按钮来看这个线程的是否退出。下面就是mainwindow的代码。


#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MyThread;
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
private:
    MyThread* subThread;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "mythread.h"
#include <QDebug>


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    qDebug() << "主线程对象地址:  " << QThread::currentThread();
    // 创建子线程
     subThread = new MyThread;

    connect(subThread, &MyThread::curNumber, this, [=](int num)
    {
        ui->label->setNum(num);
    });

    connect(ui->startBtn, &QPushButton::clicked, this, [=]()
    {
        // 启动子线程
        subThread->start();
    });


}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_pushButton_clicked()
{
    ui->label_2->setNum(subThread->isFinished());
}


经过验证,线程确实退出了。
目前理解如下:
线程还是一个函数,QT进行了封装,封装成了一个类对象。
有了这些基本概念,在开始学习一下线程同步,等同步学习完,设计我们自己想要的类,处理各种场景。


http://www.kler.cn/news/284891.html

相关文章:

  • PowerDesigner16.5 从mysql5.7逆向工程
  • ClickHouse的安装教程
  • 计算机网络概述(Internet结构和ISP)
  • matlab仿真 信道编码和交织(下)
  • 【docker】docker学习笔记
  • Datawhale AI夏令营 第五期 CV方向 Task3笔记
  • GD - GD32350R_EVAL - PWM实验和验证1
  • React原理之Diff算法
  • ESP32-S3 IDF框架 控制 WS2812 灯条:实现多种灯效
  • 【通过h5作为中转页跳转到微信小程序】
  • 【Linux】06.Linux 下的编译器——gcc/g++
  • 【C++ 第十八章】C++11 新增语法(2)
  • vue3+el-tale封装(编辑、删除、查看详情按钮一起封装)
  • 【HarmonyOS 4.0】@ohos.router 页面路由
  • ★ 算法OJ题 ★ 力扣11 - 盛水最多的容器
  • sqlite3 数据插入效率
  • YOLOv8改进 | 模块缝合 | C2f融合卷积重参数化OREPA【CVPR2022】
  • Having trouble using OpenAI API
  • 回归预测|基于鹅GOOSE优化LightGBM的数据回归预测Matlab程序 多特征输入单输出 2024年优化算法
  • vue3本地运行错误集
  • 5.3 MySql实战
  • Xilinx FPGA在线升级——升级思路
  • 鸿蒙开发5.0【基于Swiper的页面布局】
  • LeetCode 热题100-9 找到字符串中所有字母异位词
  • vscode 未定义标识符 “uint16_t“C/C++(20) 但是可以顺利编译
  • Java算法—插入排序(Insertion Sort)
  • 一种导出PPT到MP4的方法
  • 大数据测试怎么做,数据应用测试、数据平台测试、数据仓库测试
  • ​T​P​一​面​
  • 系统编程-消息队列