Qt的QThread、QRunnable和QThreadPool的使用

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://xiahunao.cn/news/2813621.html

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

相关文章

安防视频汇聚EasyCVR视频云存储平台GB28181设备全部离线是什么原因?

众所周知&#xff0c;安防视频汇聚平台EasyCVR不仅可支持的接入协议非常多&#xff08;包括&#xff1a;国标GB28181、RTSP/Onvif、RTMP&#xff0c;以及厂家的私有协议与SDK&#xff0c;如&#xff1a;海康ehome、海康sdk、大华sdk、宇视sdk、华为sdk、萤石云sdk、乐橙sdk等&a…

日更【系统架构设计师知识总结3】存储系统

【原创精华总结】自己一点点手打、总结的脑图&#xff0c;把散落在课本以及老师讲授的知识点合并汇总&#xff0c;反复提炼语言&#xff0c;形成知识框架。希望能给同样在学习的伙伴一点帮助&#xff01;

Nginx——安装和反向代理

Nginx安装与应用 1.1 Nginx介绍 Nginx 是一个高性能的HTTP和反向代理服务器,特点是占有内存少&#xff0c;并发能力强 Nginx可以作为静态页面的web服务器&#xff0c;同时还支持CGI协议的动态语言&#xff0c;比如perl、php等。但是不支持java。Java程序只能通过与tomcat配合…

CentOS 7全系列免费

CentOS 7 全系列免费&#xff1a;桌面版、工作站版、服务器版等等………… 上文&#xff0c;关于CentOS 7这句话&#xff0c;被忽略了。 注意版本&#xff1a;知识产权、网络安全。

嵌入式学习第二十二天!(继续学习线程)

线程相关函数接口&#xff1a; 1. 线程分离属性&#xff1a; 线程结束后&#xff0c;自动回收线程空间 1. pthread_attr_init&#xff1a; int pthread_attr_init(pthread_attr_t *attr); 功能&#xff1a;线程属性初始化 2. pthread_attr_destroy&#xff1a; int pthread_…

【Godot4自学手册】第十七节主人公的攻击和敌人的受伤

本节主要学习主人公是如何向敌人发起进攻的&#xff0c;敌人是如何受伤的&#xff0c;受伤时候动画显示&#xff0c;击退效果等。其原理和上一节内容相同&#xff0c;不过有许多细节需要关注和完善。 一、修改Bug 在本节学习之前&#xff0c;我将要对上一节的代码进行完善&am…

【C语言】while循环语句

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

蓝桥杯备战刷题two(自用)

1.杨辉三角形 #include<iostream> using namespace std; #define ll long long const int N2e510; int a[N]; //1 0 0 0 0 0 0 //1 1 0 0 0 0 0 //1 2 1 0 0 0 0 //1 3 3 1 0 0 0 //1 4 6 4 1 0 0 //1 5 10 10 5 1 //前缀和思想 //第一列全为1,第二列为从0开始递增1的序…

汇总版!美团搜索推荐算法面试题10道(含答案)

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂同学、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 今天我整…

【算法训练营】:周测5

需要详细的实现代码实现请私信博主 考题10-5 题目描述 平面固定有一些全等的圆角矩形&#xff0c;不同的圆角矩形具有不同的位置和倾斜角。这些圆角矩形都通过将以原本四个直角处距离两条直角边均为 r&#xfffd; 的位置为圆心&#xff0c;半径为 r&#xfffd; 且与两条直…

【蓝桥杯】青蛙跳杯子(BFS)

一.题目描述 二.输入描述 输入为 2 行&#xff0c;2 个串&#xff0c;表示初始局面和目标局面。我们约定&#xff0c;输入的串的长度不超过 15。 三.输出描述 输出要求为一个整数&#xff0c;表示至少需要多少步的青蛙跳。 四.问题分析 注意&#xff1a;空杯子只有一个 …

go test用法(获取单元测试覆盖率)

go test用法&#xff08;获取ut覆盖率&#xff09; 为了提升系统的稳定性&#xff0c;一般公司都会对代码的单元测试覆盖率有一定要求。下面针对golang自带的测试命令go test做讲解。 1 命令 1.1 go test ./… &#xff08;运行当前目录及所有子目录下的测试用例&#xff09; …

书生·浦语大模型图文对话Demo搭建

前言 本节我们先来搭建几个Demo来感受一下书生浦语大模型 InternLM-Chat-7B 智能对话 Demo 我们将使用 InternStudio 中的 A100(1/4) 机器和 InternLM-Chat-7B 模型部署一个智能对话 Demo 环境准备 在 InternStudio 平台中选择 A100(1/4) 的配置&#xff0c;如下图所示镜像…

pclpy 最小二乘法拟合平面

pclpy 最小二乘法拟合平面 一、算法原理二、代码三、结果1.左边原点云、右边最小二乘法拟合平面后点云投影 四、相关数据 一、算法原理 平面方程的一般表达式为&#xff1a; A x B y C z D 0 ( C ≠ 0 ) Ax By Cz D 0 \quad (C\neq0) AxByCzD0(C0) 即&#xff1a; …

FPGA IO命名与Bank划分

文章目录 IO的命名IO物理命名IO功能命名 Bank简介FPGA器件功能命名与Bank划分查找XILINXIntelLATTICE IO的命名 IO物理命名 FPGA的IO物理命名规则&#xff0c;也就是我们做管脚约束时候的命名。芯片通常是长方体或者正方体&#xff0c;所以命名通常采用字母数字组合的方式&am…

在Pycharm中运行Django项目如何指定运行的端口

方法步骤&#xff1a; 打开 PyCharm&#xff0c;选择你的 Django 项目。在菜单栏中&#xff0c;选择 “Run” -> “Edit Configurations...”。在打开的 “Run/Debug Configurations” 对话框中&#xff0c;选择你的 Django server 配置&#xff08;如果没有&#xff0c;你…

【经验】vscode 鼠标拖曳不能选中整行文字,只能选中纵向矩形范围

1、问题描述 不知道昨天操作vscode设置界面时&#xff0c;误选择了啥&#xff0c;导致鼠标拖曳不能选中整行文字&#xff0c;只能选中纵向矩形范围&#xff0c;现象如下&#xff1a; 2、解决方法 1&#xff09;打开设置界面 点击左下角按键&#xff0c;选择“设置” 2&…

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

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

再见,Visual Basic——曾经风靡一时的编程语言

2020年3月&#xff0c;微软团队宣布了对Visual Basic&#xff08;VB&#xff09;的“终审判决”&#xff1a;不再进行开发或增加新功能。这意味着曾经风光无限的VB正式退出了历史舞台。 VB是微软推出的首款可视化编程软件&#xff0c;自1991年问世以来&#xff0c;便受到了广大…

Doris实战——结合Flink构建极速易用的实时数仓

目录 一、实时数仓的需求与挑战 二、构建极速易用的实时数仓架构 三、解决方案 3.1 如何实现数据的增量与全量同步 3.1.1 增量及全量数据同步 3.1.2 数据一致性保证 3.1.3 DDL 和 DML 同步 Light Schema Change Flink CDC DML 和DDL同步 3.2 如何基于Flink实现多种数…