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

Qt - 进程/线程 补充进阶

Qt - 进程/线程 补充进阶

  • 多线程
    • quit / eixt / terminate
  • QThread例子
    • tdicethread 类
      • .h
      • .cpp
    • widget 类
      • .h
      • .cpp
  • 线程同步

多线程

quit / eixt / terminate

quit

应用程序或线程安全的取消事件处理队列的执行,并随后使线程退出(如果只希望结束线程并保证它安全的清理资源,最好使用quit)
当调用quit()方法时,线程会等待一段时间来完成当前正在运行的任务和冲洗缓存,然后终止线程并发出finished()信号,告诉其他对象该线程已终止
如果线程正在执行事件循环,则该函数会等待事件循环结束后退出线程(如果线程没有运行时间循环,则该函数不会有任何效果)

eixt

直接停止线程,未处理完的事件将被丢弃并静默忽略
该方法没有给予线程任何机会来清理自己的资源和数据,并可能导致应用程序的崩溃(尽量避免使用此方法)
该方法不管线程是否在事件循环中运行,会发送一个finished信号以通知线程已经退出

terminate

可以强制终止一个线程,但是相比exit更加暴力
该方法会强制关闭线程并释放正在使用的所有资源,可以在某些情况下正常处理一个卡住的线程,但也可能导致数据丢失、资源泄漏以及应用程序不稳定(尽量避免使用该方法)

QThread例子

掷骰子

在这里插入图片描述
在这里插入图片描述

tdicethread 类

.h

#ifndef TDICETHREAD_H
#define TDICETHREAD_H#include <QObject>
#include <QThread>
#include <QRandomGenerator>class TDiceThread : public QThread
{Q_OBJECT
public:explicit TDiceThread(QObject *parent = nullptr);void diceBegin(); // 开始投骰子void dicePause(); // 暂停投void stopThread(); //  结束线程signals:void newValue(int seq,int diceValue); // 产生新点数的信号private:int m_seq=0; //int m_diceValue; // 骰子点数bool m_paused=true; // 暂停投骰子bool m_stop=false; // 停止线程 退出runprotected:void run();
};#endif // TDICETHREAD_H

.cpp

#include "tdicethread.h"TDiceThread::TDiceThread(QObject *parent): QThread{parent}
{}void TDiceThread::diceBegin() // 开始投骰子
{m_paused=false;
}void TDiceThread::dicePause() // 暂停投
{m_paused=true;
}void TDiceThread::stopThread() //  结束线程
{m_stop=true;
}void TDiceThread::run()
{m_stop=false;m_paused=true;while (!m_stop){if (!m_paused){m_diceValue=QRandomGenerator::global()->bounded(1,7); // 生成随机数m_seq++;emit newValue(m_seq,m_diceValue); //发送信号}msleep(500); // 线程休眠500ms}quit(); // m_stop==true时结束线程任务 等价于exit(0)
}

widget 类

.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QCloseEvent>
#include "tdicethread.h"QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;TDiceThread *threadA; // 工作线程protected:void closeEvent(QCloseEvent *event);private slots:void threadA_started();void threadA_finished();void threadA_newValue(int seq,int diceValue);void on_pushButton_clicked();void on_pushButton_2_clicked();void on_pushButton_3_clicked();void on_pushButton_4_clicked();
};
#endif // WIDGET_H

.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);threadA=new TDiceThread(this);connect(threadA,&TDiceThread::started,this,&Widget::threadA_started); // started信号继承自QThreadconnect(threadA,&TDiceThread::finished,this,&Widget::threadA_finished); // finished信号继承自QThreadconnect(threadA,&TDiceThread::newValue,this,&Widget::threadA_newValue); // 通过信号和槽传递参数}Widget::~Widget()
{delete ui;
}void Widget::threadA_started()
{qDebug()<<"====== threadA started ======";
}
void Widget::threadA_finished()
{qDebug()<<"====== threadA finished ======";
}void Widget::threadA_newValue(int seq,int diceValue)
{QString str=QString::asprintf("the %d times, point num is:%d",seq,diceValue);qDebug()<<str;
}void Widget::closeEvent(QCloseEvent *event)
{qDebug()<<"try to close main window";if (threadA->isRunning()){threadA->terminate(); // 强制终止线程threadA->wait(); // 等待子线程结束完成,主线程再执行}event->accept();
}void Widget::on_pushButton_clicked()
{qDebug()<<"start threadA";threadA->start();
}void Widget::on_pushButton_2_clicked()
{qDebug()<<"quit threadA";threadA->stopThread(); // 内部自动调用quit()
}void Widget::on_pushButton_3_clicked()
{qDebug()<<"start task";threadA->diceBegin();
}void Widget::on_pushButton_4_clicked()
{qDebug()<<"pause task";threadA->dicePause();
}

线程同步

相关文章:

Qt - 进程/线程 补充进阶

Qt - 进程/线程 补充进阶 多线程quit / eixt / terminate QThread例子tdicethread 类.h.cpp widget 类.h.cpp 线程同步 多线程 quit / eixt / terminate quit 应用程序或线程安全的取消事件处理队列的执行&#xff0c;并随后使线程退出&#xff08;如果只希望结束线程并保证它…...

spring笔记

spring 和 springboot的区别 自动配置原理 beanFactory接口和ApplicationContext接口 两个都是 IOC 容器 ApplicationContext接口是BeanFactory接口实现类的子类 功能&#xff1a; ApplicationContext扩展BeanFactory BeanFactoryApplicationContext控制反转国际化支持 …...

最大熵模型

最大熵模型&#xff08;maximum entropy model&#xff09;由最大熵原理推导实现 最大熵原理 最大熵原理是概率模型学习的一个准则。最大熵原理认为&#xff0c;学习概率模型时&#xff0c;在所有可能的概率模型&#xff08;分布&#xff09;中&#xff0c;熵最大的模型时最好…...

微服务中网关的配置

一、添加 Spring Cloud Gateway 依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId> </dependency>二、配置网关路由 在application.yaml中配置如下内容&#xff1a…...

Linux基本指令实现4及热键指令详解

目录 Linux热键补充&#xff1a; 1.bc指令&#xff1a; Tab键的智能补充&#xff1a; ctrlc键&#xff1a; uname指令&#xff1a; lscpu指令&#xff1a; lsmem指令&#xff1a; df -h指令&#xff1a; 关机指令&#xff1a; 扩展指令&#xff1a; Linux热键补充&#…...

系统调用与API

系统调用介绍 什么是系统调用 为了让应用程序有能力访问系统资源&#xff0c;也为了让程序借助操作系统做一些由操作系统支持的行为&#xff0c;每个操作系统都会提供一套接口&#xff0c;以供应用程序使用。系统调用涵盖的功能很广&#xff0c;有程序运行所必需的支持&#xf…...

OpenPCDet系列 | 5.4.1 DenseHead中的AnchorGenerator锚框生成模块

文章目录 AnchorGenerator模块AnchorGenerator.generate_anchors函数 AnchorGenerator模块 首先&#xff0c;根据点云场景将其划分为一个个grid&#xff0c;这个grid size是可以通过配置文件设定的点云场景方位和voxel大小计算出来的。 POINT_CLOUD_RANGE: [0, -39.68, -3, 6…...

【开发者指南】如何在MyEclipse中使用HTML或JSP设计器?(上)

MyEclipse v2022.1.0正式版下载 一、HTML & JSP 可视化设计器 本文简要介绍了 MyEclipse HTML 和 JSP Web 设计器的概念、功能和基本操作过程。这两个设计器具有相似的功能和相同的操作模型&#xff0c;但本文为专门针对其类型的内容。本文档中的示例是使用 MyEclipse HT…...

Node开发Web后台服务

简介 Node.js 是一个基于Google Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型&#xff0c;使其轻量又高效。Node.js 的包管理器 npm&#xff0c;是全球最大的开源库生态系统。 能方便地搭建响应速度快、易于扩展的网络应用&#…...

Linux下对mmap封装使用

Linux下对mmap封装使用 1、mmap简介2、Linux下mmap使用介绍2.1、mmap函数2.2、munmap函数 3、对mmap进行封装4、对封装类MEM_MAP进行测试5、mmap原理6、源代码下载 1、mmap简介 mmap即memory map&#xff0c;是一种内存映射文件的技术。mmap可以将一个文件或者其它对象映射到进…...

深入了解云计算:发展历程、服务与部署模型、未来趋势与挑战

开篇博主 bluetata 的观点&#xff1a;PaaS 服务必将是未来10年云计算权重最高的趋势&#xff08;05/02/2023 15:32&#xff09; 文章目录 一、前言二、认识了解云计算2.1 什么是云计算2.1.1 维基百科上的云计算定义2.1.2 NIST 标准云计算定义2.1.3 如果被面试如何解释云计算 2…...

使用乐鑫 Web IDE 助力物联网开发

乐鑫 Web IDE 是基于 Eclipse Theia 的框架&#xff0c;支持 ESP-IDF VS Code 插件同时具备多项辅助工具。您可以观看我们在 Espressif DevCon22 上的演示视频​​​​​​​&#xff0c;了解它的实际应用。 【乐鑫开发者大会-21】搭载 ESP-IDF Visual Studio Code 插件的乐鑫 …...

Maven(5)---Maven的部署和发布

Maven的部署和发布 在前面的博客中&#xff0c;我们已经学习了Maven的基础知识、依赖管理、插件和生命周期&#xff0c;以及多模块项目管理。本篇博客将介绍Maven的部署和发布功能。 什么是部署和发布 在软件开发过程中&#xff0c;部署和发布是非常重要的环节。部署是指将软…...

内网渗透之权限维持-黄金白银票据隐藏账户远控-RustDeskGotoHTTP

0x01权限维持-隐藏用户 CreateHiddenAccount工具 CreateHiddenAccount -u test -p Psswrd用户管理能查看到&#xff0c;命令查看看不到&#xff0c;单机版无法删除(不在任何组)&#xff0c;域环境(在administrator组中)可以删除 0x02权限维持-黄金白银票据 ⻩⾦票据⽣成攻…...

动态规划——带权活动选择

带权活动选择Time Limit: 3000 MSMemory Limit: 1000 KB Description 给定n个活动&#xff0c;活动ai表示为一个三元组(si,fi,vi)&#xff0c;其中si表示活动开始时间&#xff0c;fi表示活动的结束时间&#xff0c;vi表示活动的权重, si<fi。带权活动选择问题是选择一些活…...

软考A计划-真题-分类精讲汇总-第十八章(面向对象程序设计)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…...

【C++ 入坑指南】(09)数组

文章目录 简介一维数组1. 定义2. 特点3. 用途4. 示例 二维数组1. 定义2. 用途3. 示例 简介 C 支持数组数据结构&#xff0c;它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据&#xff0c;但它往往被认为是一系列相同类型的变量。 一维数组 1. 定义…...

Vue.js

文章目录 Vue&#xff08;前端框架&#xff09;data基本语法v-bind&#xff08;属性&#xff09;v-if&#xff08;条件&#xff09;v-formethods事件v-model表单绑定todolist&#xff08;添加删除展示内容&#xff0c;含上下移动&#xff09;es6语法生命周期函数axios发送ajax请…...

博士毕业答辩流程 注意事项

前言&#xff1a;2023年5月17日14:00-17:00&#xff0c;与实验室其他同学一起旁听了本实验室的博士论文答辩。接下来&#xff0c;我对博士毕业答辩的大致流程进行简要介绍&#xff0c;并对个环节的注意事项进行总结归纳&#xff0c;供毕业生参考。 目录 1. 准备阶段2. 汇报期间…...

拼多多开放平台订单详情接口解析

API接口订单接口是指用于实现订单相关操作的程序接口。通过这个接口&#xff0c;用户可以实现创建、修改、查询和取消订单等功能。 常见的API接口订单接口包括&#xff1a; 创建订单接口&#xff0c;用于实现用户下单操作。 修改订单接口&#xff0c;用于修改已有订单信息。 …...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础

第三周 Day 3 &#x1f3af; 今日目标 理解类&#xff08;class&#xff09;和对象&#xff08;object&#xff09;的关系学会定义类的属性、方法和构造函数&#xff08;init&#xff09;掌握对象的创建与使用初识封装、继承和多态的基本概念&#xff08;预告&#xff09; &a…...

Python实现简单音频数据压缩与解压算法

Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中&#xff0c;压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言&#xff0c;提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...

02.运算符

目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&&#xff1a;逻辑与 ||&#xff1a;逻辑或 &#xff01;&#xff1a;逻辑非 短路求值 位运算符 按位与&&#xff1a; 按位或 | 按位取反~ …...

java+webstock

maven依赖 <dependency><groupId>org.java-websocket</groupId><artifactId>Java-WebSocket</artifactId><version>1.3.5</version></dependency><dependency><groupId>org.apache.tomcat.websocket</groupId&…...