Qt的QThread、QRunnable和QThreadPool的使用

news2025/1/27 12:44:47

1.相关描述

随机生产1000个数字,然后进行冒泡排序与快速排序。随机生成类继承QThread类、冒泡排序使用moveToThread方法添加到一个线程中、快速排序类继承QRunnable类,添加到线程池中进行排序。

 2.相关界面

3.相关代码

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include "tgeneratenum.h"
#include "tbubblesort.h"
#include "tquicksort.h"
#include <QDebug>
#include <QThreadPool>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    qDebug() << "主线程:" << QThread::currentThread();

    /********************  多线程的使用方法一 ****************/
    TGenerateNum *gen = new TGenerateNum;    // 继承QThread类
    /******************* 多线程的使用方法二 **********************/
    QThread *bubbleThread = new QThread;
    TBubbleSort *bubble = new TBubbleSort;
    bubble->moveToThread(bubbleThread);
    /******************* 多线程的使用方法三 线程池的使用 **********************/
    TQuickSort *quicksort = new TQuickSort;
    QThreadPool::globalInstance()->setMaxThreadCount(10);

    // 按钮的信号槽
    connect(ui->btnStart, &QPushButton::clicked, this, [=](){
        gen->setCnt(10000);
        gen->start();
    });
    // 生成随机数
    connect(gen, &TGenerateNum::sendList, this, [=](QVector<int> list){
        quicksort->setList(list);
        QThreadPool::globalInstance()->start(quicksort);
        bubbleThread->start(); // 开启冒泡排序线程
        for(int i = 0; i < list.size(); i++){
            ui->listWidgetGenerate->addItem(QString::number(list[i]));
        }
    });
    connect(gen, &TGenerateNum::sendList, bubble, &TBubbleSort::working);

    connect(bubble, &TBubbleSort::sendList, this, [=](QVector<int> list){
        for(int i = 0; i < list.size(); i++){
            ui->listWidgetBubbleSort->addItem(QString::number(list[i]));
        }
    });

    connect(quicksort, &TQuickSort::sendList, this, [=](QVector<int> list){
        for(int i = 0; i < list.size(); i++){
            ui->listWidgetQuickSort->addItem(QString::number(list[i]));
        }
    });

    // 释放内存
    connect(this, &Widget::destroyed, this, [=](){
        gen->quit();
        gen->wait();
        gen->deleteLater();

        bubbleThread->quit();
        bubbleThread->wait();
        bubbleThread->deleteLater();
        bubble->deleteLater();

    });
}

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

生成随机数:

tgeneratenum.h

#ifndef TGENERATENUM_H
#define TGENERATENUM_H

#include <QObject>
#include <QThread>

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

    void setCnt(qint32 cnt);

    // QThread interface
protected:
    void run() override;
signals:
    void sendList(QVector<int> list);

private:
    qint32 m_cnt;
};
#endif // TGENERATENUM_H

tgeneratenum.cpp

#include "tgeneratenum.h"
#include <QRandomGenerator>
#include <QVector>
#include <QElapsedTimer>
#include <QDebug>

TGenerateNum::TGenerateNum(QObject *parent):QThread(parent) {}

void TGenerateNum::setCnt(qint32 cnt)
{
    m_cnt = cnt;
}

void TGenerateNum::run()
{
    qDebug() << "生成随机数线程地址:" << QThread::currentThread();
    QElapsedTimer time;
    time.start();
    QVector<int> list;
    for(int i = 0; i < m_cnt; i++){
        int num = QRandomGenerator::global()->bounded(100000);
        list.push_back(num);
    }
    int milsec = time.elapsed();
    qDebug() << "生成" << m_cnt << "个随机数总共用时:" << milsec << "毫秒";
    emit sendList(list);
}

生成随机数,需要加时间种子

冒泡排序:

tbubblesort.h

#ifndef TBUBBLESORT_H
#define TBUBBLESORT_H

#include <QObject>

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

    void working(QVector<int> list);
signals:
    void sendList(QVector<int> list);
private:
    void bubbleSort(QVector<int>& list);
    QVector<int> m_list;
};

#endif // TBUBBLESORT_H

tbubblesort.cpp

#include "tbubblesort.h"
#include <QElapsedTimer>
#include <QDebug>
#include <QThread>

TBubbleSort::TBubbleSort(QObject *parent)
    : QObject{parent}
{}

void TBubbleSort::working(QVector<int> list)
{
    qDebug() << "冒泡线程地址:" << QThread::currentThread();
    QElapsedTimer time;
    time.start();
    this->bubbleSort(list);
    int milsec = time.elapsed();
    qDebug() << "冒泡排序总共用时:" << milsec << "毫秒";
    emit sendList(list);
}

void TBubbleSort::bubbleSort(QVector<int> &list)
{
    for (int i = 0; i < list.size(); i++){
        for (int j = 1; j < list.size()-i; j++){
            if (list[j - 1] > list[j])
            {
                int temp = list[j - 1];
                list[j - 1] = list[j];
                list[j] = temp;
            }
        }
    }
}

快速排序:

tquicksort.h

#ifndef TQUICKSORT_H
#define TQUICKSORT_H

#include <QObject>
#include <QRunnable>

class TQuickSort : public QObject, public QRunnable
{
    Q_OBJECT
public:
    explicit TQuickSort(QObject *parent = nullptr);
    void setList(QVector<int> list);
signals:
    void sendList(QVector<int> list);
    // QRunnable interface
public:
    void run() override;
private:
    void quick_sort(QVector<int>& list, int l, int r);
    QVector<int> m_list;
};


#endif // TQUICKSORT_H

tquicksort.cpp

#include "tquicksort.h"
#include <QElapsedTimer>
#include <QDebug>
#include <QThread>
TQuickSort::TQuickSort(QObject *parent)
    : QObject{parent}, QRunnable()
{
    // 开启自动回收,由线程池回收对象资源
    setAutoDelete(true);
}

void TQuickSort::setList(QVector<int> list)
{
    m_list = list;
}

void TQuickSort::run()
{
    qDebug() << "快排线程地址:" << QThread::currentThread();
    QElapsedTimer time;
    time.start();
    this->quick_sort(m_list, 0, m_list.size());
    int milsec = time.elapsed();
    qDebug() << "快速排序总共用时:" << milsec << "毫秒";
    emit sendList(m_list);
}

void TQuickSort::quick_sort(QVector<int>& list, int l, int r){
    //如果小于等于1个数据元素·直接返回结束快排函数 r为数组元素总个数
    if(l+1 >= r){
        return ;
    }
    int first = l, last = r-1, key = list[first];
    while(first < last){
        while(first < last && list[last] >= key){
            --last;
        }
        //如果值小于 key分界值 交换
        list[first] = list[last];

        while(first < last && list[first] < key){
            ++first;
        }
        //如果值大于key分界值 交换
        list[last] = list[first];
    }
    list[first] = key;
    //递归左右部分进行快排
    quick_sort(list, l, first);
    quick_sort(list, first+1, r);
}

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

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

相关文章

软件License授权原理

软件License授权原理 你知道License是如何防止别人破解的吗&#xff1f;本文将介绍License的生成原理&#xff0c;理解了License的授权原理你不但可以防止别人破解你的License&#xff0c;你甚至可以研究别人的License找到它们的漏洞。喜欢本文的朋友建议收藏关注&#xff0c;…

ARMv8-AArch64 的异常处理模型详解之异常处理详解(同步异常和异步异常的分析和处理)

这里写目录标题 一&#xff0c;同步异常的分析1.1 同步异常分析-异常链接寄存器ELR1.2 同步异常分析-异常综合寄存器ESR&#xff0c;Exception Syndrome Register1.3 同步异常分析-错误地址寄存器FAR,Fault Address Register 二&#xff0c; 同步异常的处理示例 Synchronous ex…

Maven jar 的查找及依赖版本确定

关于 jar 的查找&#xff0c;及使用版本的确定&#xff0c;及依赖的版本确认&#xff0c;避免 jar 冲突或版本不兼容 在使用 maven 构建项目时&#xff0c;需要的 jar 可以通过在 https://mvnrepository.com/ 可以找到部分需要的依赖&#xff0c;这里以查找 mybatis 依赖为例&…

【LeetCode】升级打怪之路 Day 07:nSum 问题

今日题目&#xff1a; 15. 三数之和 | LeetCode18. 四数之和 | LeetCode454. 四数相加 II | LeetCode383. 赎金信 | LeetCode 目录 Problem 1&#xff1a;nSum 问题 【必会】LC 15. 三数之和 【classic, important】LC 18. 四数之和 【classic, important】 Problem 2&#xff…

3DIoUMatch: Leveraging IoU Prediction for Semi-Supervised 3D Object Detection

3DIoUMatch: Leveraging IoU Prediction for Semi-Supervised 3D Object Detection 论文链接&#xff1a;https://arxiv.org/pdf/2012.04355.pdf 代码链接&#xff1a;https://github.com/yezhen17/3DIoUMatch 作者单位&#xff1a;Stanford University等 发表平台&#xff1a;…

Terra Photos再升级,春节照片整理新选择

今年春节那叫一个热闹非凡 像今年火到英国的英歌舞小马也看了好几场 照片、视频咔咔拍 想家的时候点开视频仿佛又回到了春节 什么&#xff1f; 你问我视频太多了不够存怎么办&#xff1f; 嘿你可别忘了我是做什么的 铁威马NAS来帮你 之前跟大家介绍过铁威马独家应用 Te…

Python中各种符号的意义

Python中的各种符号总结如下&#xff1a; 运算符 描述实例算术运算符加 - 两个对象相加a b 输出结果 30-减 - 得到负数或是一个数减去另一个数a - b 输出结果 -10*乘 - 两个数相乘或是返回一个被重复若干次的字符串a * b 输出结果 200/除 - x除以yb / a 输出结果 2%取模 - 返回…

uniapp的微信小程序授权头像昵称(最新版)

前面我出过两期博客关于小程序授权登录,利用php实现一个简单的小程序授权登录并存储授权用户信息到数据库的完整流程。无奈&#xff0c;小程序官方又整幺蛾子了。wx.getUserInfo接口收回&#xff0c;wx.getUserProfile接口也不让用。导致我的个人小程序&#xff1a;梦缘 的授权…

微服务-实用篇

微服务-实用篇 一、微服务治理1.微服务远程调用2.Eureka注册中心Eureka的作用&#xff1a;搭建EurekaServer服务Client服务注册服务发现Ribbon负载均衡策略配置Ribbon配置饥饿加载 3.nacos注册中心使用nacos注册中心服务nacos区域负载均衡nacos环境隔离-namespaceNacos和Eureka…

如何将本地项目上传到github上

将本地项目上传到github上有很多种方法&#xff0c;这里只讲述我认为最简单快捷的一种&#xff0c;先在github中创建一个仓库&#xff0c;接着在本地建文件夹&#xff0c;用命令行将项目推送到本地仓库&#xff0c;然后连接远程仓库&#xff0c;将本地项目推送到远程仓库上。要…

成功解决[!] CocoaPods could not find compatible versions for pod “sqflite“

当pod install时出现下面的错误&#xff1a; Analyzing dependencies [!] CocoaPods could not find compatible versions for pod "sqflite": In Podfile:sqflite (from .symlinks/plugins/sqflite/darwin)Specs satisfying the sqflite (from .symlinks/plugins…

【leetcode热题】杨辉三角 II

难度&#xff1a; 简单通过率&#xff1a; 41.1%题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定一个非负索引 k&#xff0c;其中 k ≤ 33&#xff0c;返回杨辉三角的第 k 行。 在杨辉三角中&#xff0c;每个数是它左上方和右上方的数的和。 示…

基于R语言的Meta分析【全流程、不确定性分析】方法与Meta机器学习技术应用

Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;最早出现于“循证医学”&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面。…

就业班 2401--2.26 Linux Day5--进程管理一

一、权限扩展 文件权限管理之&#xff1a; 隐藏权限防止root误删除 文件属性添加与查看 [rootlinux-server ~]# touch file1 file2 file3 1.查看文件属性 [rootlinux-server ~]# lsattr file1 file2 file3 ---------------- file1 ---------------- file2 ----------------…

2024022601-数据库语言SQL

数据库语言SQL SQL的发展 1974年&#xff0c;由Boyce和Chamberlin提出 1975~1979&#xff0c;IBM San Jose Research Lab的关系数据库管理系统原型System R实施了这种语言 SQL-86是第一个SQL标准 SQL-89、SQL-92(SQL2)、SQL-99(SQL3) 非过程化语言 SQL语言进行数据库操作…

Android 框架设计模板

不同项目在使用该模板时多少会有出入&#xff0c;应以项目实际情况作为依据。 &#xff08;该文档可以 .md 格式存放于项目根目录&#xff0c;或编写到readme 中&#xff09; 项目描述 涉及如下方面 项目背景 &#xff08;可引用项目立项书&#xff09;项目需求 &#xff08…

小技巧:Nuxt处理全局组件的显示与隐藏

在Nuxt开发过程中&#xff0c;大家会遇到需要控制全局组件的显示与隐藏。比如说移动端的路由导航栏、头部的返回操作。。。 为了使切换页面的同时&#xff0c;确定是否展示全局组件&#xff0c;保证页面展示的平稳过渡。 下面是我在项目中用到一个办法&#xff0c;已实现。 …

formality:set_constant应用

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 往期文章链接: formality:形式验证流程 scan mode func的功能检查需要把scan mode设置成0。

petalinux烧写image.ub报错

xinlinx SDK烧写petalinux生成的BOOT.BIN和image.ub时&#xff0c;BOOT.BIN烧写正常&#xff0c;image.ub烧写报错如下 Erase Operation failed. INFO: [Xicom 50-44] Elapsed time 0 sec.ERROR: Flash Operation Failed串口助手操作擦除flash如图&#xff1a; 解决方法&am…

【自然语言处理四-从矩阵操作角度看 自注意self attention】

自然语言处理四-从矩阵操作角度看 自注意self attention 从矩阵角度看self attention获取Q K V矩阵注意力分数softmax注意力的输出再来分析整体的attention的矩阵操作过程从矩阵操作角度看&#xff0c;self attention如何解决问题的&#xff1f;W^q^ W^k^ W^v^这三个矩阵怎么获…