Qt创建线程(继承于QThread的方法)

news2024/11/17 14:46:40

1.QThread:

继承QThread创建子线程的注意点:

(1)需要写一个继承QThread的子类,然后必须要重写继承的run()函数(在run函数里面重写要在线程中执行的方法(任务函数))

(2)创建这个子类的实例对象,然后调start()方法就可以让线程工作了

缺点:(1)如果要在一个继承QThread的子类里面重写run函数时,如果想一个run函数实现多个任务函数,那么这个run函数写起来就很复杂,不利于代码的可读性

2.使用QThread方法实现点击开始按钮生成10000个随机数,然后分别使用冒泡排序和快速排序排序这10000个随机数,最后在窗口显示排序后的数字:

mainwindow.h文件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
signals:
    void starting(int num);
private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mythread.h文件:

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QThread>
//生成随机数
class MyThread : public QThread
{
    Q_OBJECT
public:
    explicit MyThread(QObject *parent = nullptr);
    void recvNum(int num);
protected:
    void run() override;
signals:
    void sendArray(QVector<int> list);
private:
    int m_num;
};

class BubbleSort : public QThread
{
    Q_OBJECT
public:
    explicit BubbleSort(QObject *parent = nullptr);
    void recvArray(QVector<int> list);
protected:
    void run() override;
signals:
    void finish(QVector<int> num);
private:
    QVector<int> m_list;
};

class QuickSort : public QThread
{
    Q_OBJECT
public:
    explicit QuickSort(QObject *parent = nullptr);
    void recvArray(QVector<int> list);
private:
    void quickSort(QVector<int> &list, int l, int r);

protected:
    void run() override;
signals:
    void finish(QVector<int> num);
private:
    QVector<int> m_list;

};
#endif // MYTHREAD_H

mian.cpp文件:

#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    qRegisterMetaType<QVector<int>>("QVector<int>");
    MainWindow w;
    w.show();
    return a.exec();
}

mainwindow.cpp文件: 

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "mythread.h"
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //1.创建子线程的对象
    MyThread *gen = new MyThread;
    BubbleSort *bubble = new BubbleSort;
    QuickSort *quick = new QuickSort;
    connect(this, &MainWindow::starting, gen, &MyThread::recvNum);
    //2.启动子线程
    connect(ui->start, &QPushButton::clicked, this, [=]{
        emit starting(10000); //在启动子线程时,将要生成的随机数的个数发送出去
        gen->start();

    });
    //接收子线程发送的数据
    connect(gen, &MyThread::sendArray, bubble, &BubbleSort::recvArray);
    connect(gen, &MyThread::sendArray, quick, &QuickSort::recvArray);
    connect(gen, &MyThread::sendArray, this, [=](QVector<int> list){ //connect里面不支持传递QVector类型//需要使用qRegisterMetaType()进行注册
        bubble->start();
        quick->start();
        for(int i = 0; i < list.size(); i++){
            ui->randList->addItem(QString::number(list.at(i)));
        }
    });
    connect(bubble, &BubbleSort::finish, this, [=](QVector<int> list){ //connect里面不支持传递QVector类型//需要使用qRegisterMetaType()进行注册
        for(int i = 0; i < list.size(); i++){
            ui->bubbleList->addItem(QString::number(list.at(i)));
        }
    });
    connect(quick, &QuickSort::finish, this, [=](QVector<int> list){ //connect里面不支持传递QVector类型//需要使用qRegisterMetaType()进行注册
        for(int i = 0; i < list.size(); i++){
            ui->quickList->addItem(QString::number(list.at(i)));
        }
    });

    //窗口关闭时,释放资源
    //窗口关闭时,会发送一个destroyed()信号,就可以根据这个信号来销毁线程的资源
    connect(this, &MainWindow::destroyed, this,[=]{
        gen->quit();
        gen->wait();
        gen->deleteLater(); //delete gen 销毁线程gen的资源

        bubble->quit();
        bubble->wait();
        bubble->deleteLater(); //delete bubble 销毁线程t2的资源

        quick->quit();
        quick->wait();
        quick->deleteLater(); //delete quick 销毁线程quick的资源


    });
    \
    \
}


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

mythread.cpp文件:

#include "mythread.h"
#include <QVector>
#include <QElapsedTimer> //计算某个流程执行所使用的时间
#include <QDebug>
#include <QThread>
MyThread::MyThread(QObject *parent)
    : QThread(parent)
{

}

void MyThread::recvNum(int num)
{
    m_num = num;
}

void MyThread::run()
{
    qDebug() << "生成随机数的线程地址" << QThread::currentThread(); //获取一个指针,这个指针指向当前线程对象的地址
    QVector<int> list;
    QElapsedTimer time;
    time.start();
    for(int i = 0; i < m_num; i++){
        list.push_back(qrand() % 100000);
    }
    int milsec = time.elapsed();
    qDebug() << "生成" << m_num << "个随机数总共用时:" << milsec << "毫秒";
    emit sendArray(list);
}

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

}

void BubbleSort::recvArray(QVector<int> list)
{
    m_list = list;
}

void BubbleSort::run()
{
    qDebug() << "冒泡排序的线程地址" << QThread::currentThread(); //获取一个指针,这个指针指向当前线程对象的地址
    QElapsedTimer time;
    time.start();
    for(int i = 0; i < m_list.size() - 1 ;i++){
        for(int j = 0;j < m_list.size() - i - 1; j++){
            if(m_list[j] > m_list[j + 1]){
                int temp = m_list[j];
                m_list[j] = m_list[j + 1];
                m_list[j + 1] = temp;
            }
        }
    }
    int milsec = time.elapsed();
    qDebug() << "冒泡排序用时" << milsec << "毫秒";
    emit finish(m_list);
}

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

}

void QuickSort::recvArray(QVector<int> list)
{
    m_list = list;
}

void QuickSort::quickSort(QVector<int> &s, int l, int r)
{
    if(l < r){
        int i = l, j = r;
        int x = s[l];
        while(i < j){
            while(i < j &&s[j] >=x){
                j--;
            }
            if(i < j){
                s[i++] = s[j];
            }
            while(i < j && s[i] < x){
                i++;
            }
            if(i < j){
                s[j--] = s[i];
            }
        }
        s[i] = x;
        quickSort(s, l, i - 1);
        quickSort(s, i + 1, r);
    }
}

void QuickSort::run()
{
    qDebug() << "快速排序的线程地址" << QThread::currentThread(); //获取一个指针,这个指针指向当前线程对象的地址
    QElapsedTimer time;
    time.start();
    quickSort(m_list, 0,m_list.size()-1);
    int milsec = time.elapsed();
    qDebug() << "快速排序用时" << milsec << "毫秒";
            emit finish(m_list);
}

运行结果:

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

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

相关文章

STM32单片机中国象棋TFT触摸屏小游戏

实践制作DIY- GC0167-中国象棋 一、功能说明&#xff1a; 基于STM32单片机设计-中国象棋 二、功能介绍&#xff1a; 硬件组成&#xff1a;STM32F103RCT6最小系统2.8寸TFT电阻触摸屏24C02存储器1个按键&#xff08;悔棋&#xff09; 游戏规则&#xff1a; 1.有悔棋键&…

有没有免费的人才测评工具,免费的人才测评系统软件?

最近看到知乎上有个问题挺火的&#xff0c;就是问有没有免费的人才测评工具&#xff0c;人才测系统软件目前是有挺多的&#xff0c;但是要说免费&#xff0c;我还真心没有听说过&#xff0c;不但不免费&#xff0c;比较专业的人才测评公司&#xff0c;价格还是非常高的。 人才…

目标检测(Object Detection)概念速通

参考博文&#xff1a;目标检测&#xff08;Object Detection&#xff09;_YEGE学AI算法的博客-CSDN博客 这篇参考的相当多&#xff0c;写的真的很好很入门&#xff0c;觉得很有用&#xff0c;想详细了解的可以去看看&#xff0c;侵删↑ 上回组会分享了DETR和MDETR&#xff0c;…

【lesson9】进程

文章目录 什么是进程如何管理进程查看进程创建子进程 什么是进程 我们用一张Windows下的任务管理器图来辅助我们观看&#xff0c;我们一个可以看到应用在运行的时候就是一个个进程。 所以我们启动了一个软件本质上就是启动了一个进程。 在Linux下运行一条命令&#xff0c;./XXX…

探究Vcenter虚拟化方案中,VirtualMachine庞大结构体中各字段的含义

SDK中mo.VirtualMachine结构体定义如下: type VirtualMachine struct { ManagedEntity Capability types.VirtualMachineCapability mo:"capability" Config *types.VirtualMachineConfigInfo mo:"config" Layout …

十二、流程控制-循环

流程控制-循环 1.while循环语句★2.do...while语句★3.for循环语句 —————————————————————————————————————————————————— 1.while循环语句★ while语句也称条件判断语句&#xff0c;它的循环方式是利用一个条件来控制是否…

Spring实例化源码解析之ConfigurationClassPostProcessor(二)

ConfigurationClassPostProcessor源码 解析 书接上回&#xff0c;在第一次调用invokeBeanDefinitionRegistryPostProcessors方法的时候参数currentRegistryProcessors为ConfigurationClassPostProcessor&#xff0c;本章主要深入这个类的postProcessBeanDefinitionRegistry方法…

linux部署页面内容

/bin&#xff1a;该目录包含了常用的二进制可执行文件&#xff0c;如ls、cp、mv、rm等等。 /boot&#xff1a;该目录包含了启动Linux系统所需的文件&#xff0c;如内核文件和引导加载程序。 /dev&#xff1a;该目录包含了所有设备文件&#xff0c;如硬盘、光驱、鼠标、键盘等等…

LeetCode 刷题记录——从零开始记录自己一些不会的(二)

20. 替换后的最长重复字符 题意 给你一个字符串 s 和一个整数 k 。你可以选择字符串中的任一字符&#xff0c;并将其更改为任何其他大写英文字符。该操作最多可执行 k 次。 在执行上述操作后&#xff0c;返回包含相同字母的最长子字符串的长度。 思路 代码 class Solution…

学习MLPERF

测试基准与标准 | BenchCouncil 其中涉及AI的有如下&#xff1a; AI (1) AIBench Training AIBench 培训采用平衡的 AI 基准测试方法&#xff0c;考虑全面性、代表性、可负担性和可移植性。该方法广泛调查人工智能任务和模型&#xff0c;并在最大程度上涵盖了算法级、系统级…

玩转YAML配置文件占位符 ,同事纷纷直呼大佬

配置文件占位符 Spring Boot配置文件支持占位符&#xff0c;一些用法如下&#xff1a; 为server.port设置一个随机端口 server: port: ${random.int} 其他随机占位符 // 随机数占位符${random.value} - 类似uuid的随机数&#xff0c;没有"-"连接${random.int} - 随…

【李沐深度学习笔记】矩阵计算(5)

课程地址和说明 线性代数实现p4 本系列文章是我学习李沐老师深度学习系列课程的学习笔记&#xff0c;可能会对李沐老师上课没讲到的进行补充。 本节是第五篇&#xff0c;由于CSDN限制&#xff0c;只能被迫拆分 矩阵计算 多元函数的等高线 此处参考视频&#xff1a;熟肉)多元…

c语言-实用调试技巧

什么是bug&#xff1f; 程序中出现的问题 调试是什么&#xff1f;有多重要&#xff1f; 测试的基本步骤&#xff1a;发现程序错误的存在 以隔离、消除等方式对错误进行定位&#xff0c;确定错误产生的原因&#xff0c;提出纠正错误的解决办法&#xff0c;对程序错误予以改正…

【Servlet】第一个 Servlet 项目

第一个 Servlet 项目 一. Servlet 是什么二. Servlet 主要做的工作三. 第一个 Servlet 程序1. 创建项目2. 引入依赖3. 创建目录4. 编写代码5. 打包程序6. 部署程序7. 验证程序 四. 更方便的部署方式1. 安装 Smart Tomcat 插件2. 配置 Smart Tomcat 插件 一. Servlet 是什么 Se…

2023华为杯数学建模研赛思路分享——最全版本E题技术文档深度解析已出

2023华为杯数学建模研赛E题最新完整版技术文档已出 更多内容加群了解咨询【云顶数模科研交流群】&#xff1a; 正在跳转​qm.qq.com/cgi-bin/qm/qr?_wv1027&kzZ9YYiFSIhMwasovgcr-Fq6wp_ZF2-To&authKeyIDnk4VjKwk4FWcwTKW1ye8qfCOZjKbx%2FeLQVSFeD%2BrrUNJnhWAYwC%2…

OceanBase再获OSCAR两项大奖,坚定开源开放

2023 年 9 月 21 日&#xff0c;由中国信息通信研究院&#xff08;简称“中国信通院”&#xff09;、中国通信标准化协会联合主办的“OSCAR 开源产业大会”在京召开。本次发布了 2023 年可信开源评估结果&#xff0c;OceanBase 通过 可信开源 社区评估&#xff0c;荣获 “OSCAR…

【打开新世界大门】看测试老鸟如何把API 测试玩弄在鼓掌之间

【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程&#xff0c;刷完面试就稳了&#xff0c;你也可以当高薪软件测试工程师&#xff08;自动化测试&#xff09; 一、API 测试的基本步骤 我介绍过当今互联网产品的测试策略往往会采用菱形结构&#xff0c;即重量级 AP…

蜣螂优化(DBO)算法的5种最新变体(含MATLAB代码)

先做一个声明&#xff1a;文章是由我的个人公众号中的推送直接复制粘贴而来&#xff0c;因此对智能优化算法感兴趣的朋友&#xff0c;可关注我的个人公众号&#xff1a;启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法&#xff0c;经典的&#xff0c;或者是近几年…

spark Structured报错解决

报错&#xff0c;不想看原因的直接去解决方案试试 Exception in thread "main" java.lang.IllegalArgumentException: Pathname /C:/Users/Administrator/AppData/Local/Temp/1/temporary-611514af-8dc5-4b20-9237-e5f2d21fdf88/metadata from hdfs://master:8020/C…

C/C++连接数据库,包含完整代码。

C/C连接数据库 本篇文章意在简洁明了的在linux环境下使用C/C连接远程数据库&#xff0c;并对数据库进行增删查改等操作。我所使用的环境是centos7&#xff0c;不要环境除环境配置外&#xff0c;代码是大同小异的。完整代码在最底部&#xff01;&#xff01;&#xff01; 1.前…