【QT学习】14.线程学习

一。线程了解

        线程是计算机科学中的一个重要概念,它是操作系统能够进行运算调度的最小单位。线程是进程中的一个执行流,一个进程可以包含多个线程。与进程相比,线程更轻量级,可以更高效地利用计算机资源。

线程有以下几个特点:

  1. 并发执行:多个线程可以同时执行,提高了程序的执行效率。
  2. 共享内存:同一进程中的线程共享相同的内存空间,可以方便地进行数据共享和通信。
  3. 轻量级:线程的创建和销毁开销较小,切换线程的开销也较小。

线程可以用于实现并发编程,常见的应用场景包括:

  1. 提高程序的响应速度:将耗时的操作放在一个单独的线程中执行,可以避免阻塞主线程,提高用户体验。
  2. 并行计算:将任务分解成多个子任务,每个子任务由一个线程执行,可以加速计算过程。
  3. 处理IO密集型任务:在等待IO操作完成的过程中,可以切换到其他线程执行其他任务,提高系统的利用率。

二。实例:实现显示时间的同时,显示一个随机数据

1.方式一:使用两个定时器

结果:

        点击关闭,定时器t2关闭,点击开始,定时器t2开始。

1.创建属性

2.函数实现

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//随机数qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));//t1监听connect(&t1,&QTimer::timeout,[=](){//获取当前时间QDateTime currentTime=QDateTime::currentDateTime();QString str=currentTime.toString("yyyy.MM.dd hh:mm:ss ddd");//显示当前文本ui->lineTime->setText(str);});//t2监听connect(&t2,&QTimer::timeout,[=](){//获得一个随机数QString str = QString("%1").arg(qrand()%100000000);//显示到行文本ui->lineRand->setText(str);});//定时器开始t1.start(1000);t2.start(100);
}

两个按钮的槽函数

2.线程方式二:使用两个线程(与方式三相比较)

结果:

        使用线程处理的日期,随机数如果想要做的话,需要去在创建一个线程类

1.线程类属性

线程信号isDone没有内容,就是一个信号标识符,在run函数使用emit发送信号即可。

1.wiget类的属性

注意:要创建关闭线程,因为进程关闭时,不会自动关闭线程,需要手动关闭

2.函数实现

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);pTimeThread=new timeThread(this);pTimeThread->start();//使用线程处理时间----connect(pTimeThread,&timeThread::isDone,[=](){//获取当前时间QDateTime currentTime = QDateTime::currentDateTime();QString str = currentTime.toString("yyyy.MM.dd hh:mm:ss ddd");//显示到行文本ui->lineTime->setText(str);});//在关掉窗口的时候结束线程----connect(this,&Widget::destroyed,this,&Widget::quitThread);
}
//关闭线程
void Widget::quitThread(){//t1.stop();pTimeThread->quit();//结束线程  但是不会回收线程的资源pTimeThread->wait();//回收线程资源
}

2.线程方式三:使用两个线程

结果:

线程类属性:

    //线程处理函数void myTimer();void setFlag(bool f);
signals:void isDone();
private:bool flag;

线程类函数实现:

void mysubthread::myTimer(){while(flag){emit isDone();//发送信号 让主线程可以响应QThread::sleep(1);qDebug()<<"子进程"<<QThread::currentThread();}
}
void mysubthread::setFlag(bool f){flag=f;
}

widget类属性

public:Widget(QWidget *parent = nullptr);~Widget();
private slots://线程处理对象的信号void dealDone();//线程处理函数void quitThread();//关闭线程void on_btnOpen_clicked();void on_pushButton_2_clicked();signals:void  startThread();
private:Ui::Widget *ui;mysubthread* pMySubThread;QThread* pThread;
};

widget类实现

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//创建对象pMySubThread=new mysubthread;pThread=new QThread(this);//添加到(自建类设置成QThread子类)pMySubThread->moveToThread(pThread);//设置线程的处理函数-》按钮信息给线程类,线程类间隔一段时间向widget发送信号connect(this,&Widget::startThread,pMySubThread,&mysubthread::myTimer);//处理线程函数 中的信号-》widget接受信号,处理数据,展示页面connect(pMySubThread,&mysubthread::isDone,this,&Widget::dealDone);//关闭窗口的时候结束线程connect(this,&Widget::destroyed,this,&Widget::quitThread);
}
//注意要delete-》自建类(他设置的父类是QThread,不是this,需要手动收回)
Widget::~Widget()
{delete pMySubThread;delete ui;
}
//启动线程
void Widget::on_btnOpen_clicked()
{pMySubThread->setFlag(true);pThread->start();emit startThread();
}
//关闭线程
void Widget::on_pushButton_2_clicked()
{//手动结束mysubthread::myTimer()循环pMySubThread->setFlag(false);pThread->quit();pThread->wait();
}
void Widget::quitThread(){Widget::on_pushButton_2_clicked();
}
//处理线程兑现的信号
void Widget::dealDone(){static int i=0;i++;ui->lcdNumber->display(i);
}

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

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

相关文章

OpenCV|简单绘制一个矩形

OpenCV中的rectangle() 为绘制矩形命令&#xff0c;形式如下&#xff1a; # (img: cv2.typing.MatLike, pt1: cv2.typing.Point, pt2: cv2.typing.Point, color: cv2.typing.Scalar, thickness: int ..., lineType: int ..., shift: int ...)cv2.rectangle(img, pt1, pt2, …

Dynamic Extraction of Subdialogues for Dialogue Emotion Recognition

对话情感识别的子对话动态提取 摘要1. 介绍2 相关工作2.1 对话上下文建模2.2 常识知识 3 方法3.1 问题定义3.2 模型概述3.3 特征提取模块3.4 依赖性建模3.5 交互式子对话提取模块3.6 重要性增强的多头自注意力模块3.7 子对话框主题提取模块3.8. 分类模块 四、实验4.1 数据集4.1…

含义:理财风险等级R1、R2、R3、R4、R5

理财风险等级R1、R2、R3代表什么&#xff0c;为什么R1不保本&#xff0c;R2可能亏损 不尔聊投资https://author.baidu.com/home?frombjh_article&app_id1704141696580953 我们购买理财产品的时候&#xff0c;首先都会看到相关产品的风险等级。风险等级约定俗成有5级&…

Java进阶07集合(续)

Java进阶07 集合&#xff08;续&#xff09; 一、数据结构&#xff08;树&#xff09; 1、关于树 1.1 相关概念 节点&#xff1a;树中每个单独的分支 节点的度&#xff1a;每个节点的子节点数量 树高&#xff1a;树的总层数 根节点&#xff1a;最顶层节点 左子节点&…

Python专题:三、数字和运算(2)

目录 一、数学运算 二、赋值运算 一、数学运算 1、运算符号 加法 减法- 乘法* 除法/ 计算机中浮点数表示有精度限制&#xff0c;Python有限&#xff0c;所以近似取数 2、除法取整// Python2中 整数/整数 值为整数 Python3中 整数/整数 整数or浮点数 //计算除法对结果取…

2024年最适合做的母婴赛道,选品思路揭秘,教你如何选品!

大家好&#xff0c;我是电商花花。 在我印象中&#xff0c;每年都有人唱衰抖音小店不好做了&#xff0c;太卷了&#xff0c;普通人没有机会了&#xff0c;但是现在直播电商时代&#xff0c;很多信息都会片面的&#xff0c;做不好并不是因为不好做&#xff0c;而是因为你做不好…

60*13薪,外包到新疆...去吗?

大家好&#xff0c;我是白露呀。 今天我在牛客上看到一篇帖子&#xff0c;一位网友说自己收到一个 offer &#xff0c;薪资很高&#xff1a;60k*13&#xff0c;大约一年有近80万。 但是有个要求是外包到新疆的乌鲁木齐&#xff0c;他拿不定主意&#xff0c;就在牛客上发了这个…

Crocoddyl 使用教程(二)

系列文章目录 前言 小车摆杆是另一个经典的控制实例。在这个系统中&#xff0c;一根欠驱动的杆子被固定在一辆一维驱动的小车顶部。游戏的目的是将杆子升到站立位置。 模型如下&#xff1a; https://en.wikipedia.org/wiki/Inverted_pendulum 我们用 表示小车质量、 表示摆杆质…

Agent Hospital: 一种可进化医疗代理人的医院模拟器

论文来源: https://arxiv.org/pdf/2405.02957 1 引言 大型语言模型(LLM)代理在各种任务中表现出了有前景的性能,包括代码生成、信息博弈和问答等。受 LLM 代理能力的启发,一些研究采用它们来模拟人类互动和行为,而不是处理单一任务,例如社交媒体上的信息传播和"Stanford…

Pyside6详细使用教程python之GUI开发

1、首先需要安装Pyside6&#xff0c;终端执行命令&#xff1a; pip3.10 install pyside6 2、你们的一般是 pip install pyside6 2、如下代码创建一个简易程序导入必要的模块 import sys from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton,…

c语言实现贪吃蛇小游戏————附全代码!!!

目录 1.Win32 API 1.1控制台应用程序 1.2控制台的名称&#xff0c;控制台窗口大小 1.3设置控制台光标位置 COORD - 光标坐标 GetStdHandle - 获取句柄 SetConsoleCursorPosition - 设置光标位置 封装一个设置光标的函数 1.4设置控制台光标的属性 CONSOLE_CURSOR_INFO …

HNU-人工智能-作业1

人工智能-作业1 计科210x 甘晴void 第1题 考虑一个实时的在线电话翻译系统&#xff0c;该系统实现英语与日语之间的实时在线翻译&#xff0c;讨论该系统的性能度量&#xff0c;环境&#xff0c;执行器&#xff0c;感知器&#xff0c;并对该环境的属性进行分析。&#xff08;10…

【Android】源码解析Activity的结构分析

源码解析Activity的结构分析 目录 1、Activity、View、Window有什么关联&#xff1f;2、Activity的结构构建流程3 源码解析Activity的构成 3.1 Activity的Attach方法3.2 Activity的OnCreate 4、WindowManager与View的关系总结 1、一个Activity对应几个WindowManage&#xff0…

Java 中的 HTTP 客户端库OkHttp、Apache HttpClient和HttpUrlConnection

大家好&#xff0c;我是G探险者。 项目开发里面经常会有这么一种场景&#xff1a;与服务器进行 HTTP 通信。一般存在于服务间远程调用的场景 Java 生态系统提供了多种 HTTP 客户端库&#xff0c;每种都有其自己的特点、优势和适用场景。 本文将介绍几种主要的 Java HTTP 客户…

基于Springboot的校园招聘系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的校园招聘系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

modprobe: can‘t open ‘modules.dep‘: No such file or directory

使用modprobe会提示modprobe: cant open modules.dep: No such file or directory 直接输入depmod即可。 如果depmod没有效果&#xff0c;则需要重新配置编译你的根文件。 在busybox配置界面进入linux Module Utilities, 上下键选择depmod&#xff0c;并按 y 选中&#xff0c…

期权和期货有什么区别?

今天期权懂带你了解期权和期货有什么区别&#xff1f;期权和期货是两种常见的衍生金融工具&#xff0c;它们在结构和盈利方式上存在一些关键的区别&#xff1a; 期权 期权是一种给予持有者在未来某个时间以特定价格买入或卖出基础资产的权利&#xff0c;但不是义务。期权的主要…

LeetCode 110. 平衡二叉树

LeetCode 110. 平衡二叉树 1、题目 题目链接&#xff1a;110. 平衡二叉树 给定一个二叉树&#xff0c;判断它是否是 平衡二叉树 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2…

Android 14 变更及适配攻略

准备工作 首先将我们项目中的 targetSdkVersion和compileSdkVersion 升至 34。 影响Android 14上所有应用 1.最低可安装的目标 API 级别 从 Android 14 开始&#xff0c;targetSdkVersion 低于 23 的应用无法安装。要求应用满足这些最低目标 API 级别要求有助于提高用户的安…

(二刷)代码随想录第1天|704. 二分查找 27. 移除元素

704. 二分查找 704. 二分查找 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode&#xff1a;704. 二分查找_哔哩哔哩_bilibili 给定一个 n 个元素有序的&#xff08;升序&#xff09…