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

进阶2_1:QT5多线程与定时器共生死

1、在widget.ui中使用 LCD Number控件

注意:若 LCD 控件不是多线程,LCD控件则会瞬间自增到最大的数值,如上图,说明两者都是多线程处理

2、实现方式

1、创建 LCD 控件并修改为 LCD1

2、创建任务类 mytask. h,对任务类添加信号、槽、任务的全局变量

#ifndef MYTASK_H
#define MYTASK_H#include <QObject>class MyTask : public QObject
{Q_OBJECT
public:explicit MyTask (QObject *parent = nullptr);//子线程发送信号
signals:void task2_signal (int i);//子线程接收的槽函数
public slots:void StartTimerSlots ();private:int i=0;//设置为全局变量后,必须为置为0,否则就会出现任意值QString current_date=nullptr;//可以不用赋值,默认被置为NULL
};#endif // MYTASK_H

3、在用户界面 widget. h 添加全局变量(线程变量、任务变量)

#ifndef WIDGET_H
#define WIDGET_H#include <QThread>
#include <QWidget>
#include "mytask.h"QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void TasksInit();//任务初始化private:Ui::Widget *ui;MyTask *task2; //任务2QThread *mythread;//任务2的线程};
#endif // WIDGET_H

4、在 mytask. cpp 中实现 void StartTimerSlots () 这个函数

#include "mytask.h"
#include <QDebug>
#include <unistd.h>MyTask::MyTask(QObject *parent) : QObject(parent)
{}//任务的槽函数
void MyTask::StartTimerSlots()
{//创建定时器对象QTimer *timer = new QTimer;//定时器超时(每1s)后,自动加1connect(timer, &QTimer::timeout, this, [=]{qDebug() << "子线程定时器触发" << i;emit task2_signal(i++);});timer->start(1000);
}

5、在 wideget. cpp 中

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QTimer>
#include "mytask.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);TasksInit();
}Widget::~Widget()
{delete ui;
}/*
功能:对 TCP服务端 进行多线程处理
参数:无参
返回值:无
*/
void Widget::TasksInit()
{MyTask *task2 = new MyTask;QThread *mythread = new QThread;task2->moveToThread(mythread);mythread->start();//创建定时器的开启和关闭connect(mythread, &QThread::started,task2,&MyTask::StartTimerSlots);  // 启动信号connect(mythread, &QThread::finished,task2,&QObject::deleteLater);    // 停止信号connect(mythread, &QThread::finished,mythread,&QObject::deleteLater);    // 停止信号connect(task2,&MyTask::task2_signal,this,[=](int i){ui->LCD1->display(i);},Qt::QueuedConnection);connect(this, &QObject::destroyed, this, [=] {delete task2;mythread->quit();mythread->wait();mythread->deleteLater();});
}

6、解释 wideget. cpp 中执行的步骤

MyTask *task2 = new MyTask; //创建任务对象
QThread *mythread = new QThread; //创建线程对象 
task2->moveToThread(mythread);//将任务放置到线程中
mythread->start();//开启线程
//等待线程开启,执行任务中的槽函数
connect(mythread, &QThread::started,task2,&MyTask::StartTimerSlots);
//等待线程结束,就销毁任务、线程
connect(mythread, &QThread::finished,task2,&QObject::deleteLater);    
connect(mythread, &QThread::finished,mythread,&QObject::deleteLater); 
//等待任务发送信号,用户界面this,接收信号发来的参数i
connect(task2,&MyTask::task2_signal,this,[=](int i){
            ui->LCD1->display(i);//数据i++用于显示LCD
        });
//销毁任务,线程(先销毁任务,在销毁线程)
connect(this, &QObject::destroyed, this, [=] {
    delete task2;
    mythread->quit();
    mythread->wait();
    mythread->deleteLater();
});
注意:task2的销毁事件先于mythread销毁事件
效果:通过上述,实现了,在多线程中使用定时器,定时器与线程同时开启、关闭

相关文章:

进阶2_1:QT5多线程与定时器共生死

1、在widget.ui中使用 LCD Number控件 注意&#xff1a;若 LCD 控件不是多线程&#xff0c;LCD控件则会瞬间自增到最大的数值&#xff0c;如上图&#xff0c;说明两者都是多线程处理 2、实现方式 1、创建 LCD 控件并修改为 LCD1 2、创建任务类 mytask. h&#xff0c;对任务类…...

在虚拟机Ubuntu18.04中安装NS2教程及应用

NS2简介 一、主要组成部分&#xff1a; 1.NS2&#xff1a;模拟器本身&#xff0c;负责执行TCL脚本进行模拟&#xff0c;并生成trace文件输出结果。 2.NAM&#xff1a;网络动画模拟器&#xff0c;用于将模拟结果可视化。 二、使用的语言&#xff1a; 1.C&#xff1a;NS2中最重要…...

VBA —— 第6章子程序与函数

子程序&#xff1a;实现特定功能的程序代码块 子程序语法&#xff1a; [修饰符] Sub 子程序名称([参数1&#xff0c;参数2&#xff0c;参数3]) 代码块 End Sub 子程序如何调用&#xff1a; 1 . 子程序名 [参数1&#xff0c;参数2&#xff0c;...] 2. Call 子程序名 [(参…...

MySQL知识点总结(持续更新)

聚合函数通常用于对数据进行统计和聚合操作。以下是一些常见数据库系统&#xff08;如 MySQL、PostgreSQL、Oracle、SQL Server 等&#xff09;中常用的聚合函数&#xff1a; 常见的数据库聚合函数&#xff1a; COUNT()&#xff1a;计算指定列中非空值的数量 SELECT COUNT(*) …...

全新开发-iVX图形化编程VS完整IDE

本文针对传统软件开发的效率与可控性矛盾&#xff0c;系统阐释 iVX"图形化编程 全栈 IDE" 的复合架构如何突破行业瓶颈。通过 "可视化建模 - 标准代码生成 - 独立运行" 的技术闭环&#xff0c;iVX 实现开发效率提升 60% 与源码完全可控的双重目标。研究揭…...

【android bluetooth 协议分析 12】【A2DP详解 1】【车机侧蓝牙音乐免切源介绍】

“车机蓝牙音乐免切源” 是近年来车载系统&#xff08;IVI&#xff0c;In-Vehicle Infotainment&#xff09;中常见的一个用户体验优化功能。它主要是为了简化蓝牙音乐播放流程、减少用户操作&#xff0c;提升使用便捷性。 一、什么是“切源”&#xff1f; 在车机系统中&#…...

【Linux系列】跨平台安装与配置 Vim 文本编辑器

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

蓝桥杯题库经典题型

1、数列排序&#xff08;数组 排序&#xff09; 问题描述 给定一个长度为n的数列&#xff0c;将这个数列按从小到大的顺序排列。1<n<200 输入格式 第一行为一个整数n。 第二行包含n个整数&#xff0c;为待排序的数&#xff0c;每个整数的绝对值小于10000。 输出格式 输出…...

Spring Boot整合MyBatis全攻略:原理剖析与最佳实践

MyBatis作为Java生态中最流行的ORM框架之一&#xff0c;与Spring Boot的结合极大地简化了数据库访问层的开发。本文将深入剖析Spring Boot整合MyBatis的核心机制&#xff0c;详细介绍各种使用方式&#xff0c;并分享实际开发中的高级技巧和最佳实践。 一、Spring Boot与MyBati…...

十天学会嵌入式技术之51单片机—day-10

第 20 章 18B20 温度检测 20.1 18B20 概述 20.1.1 简介 18B20 是一种常用的数字温度传感器&#xff0c;广泛应用于环境监测、工业控制、家居自动化 和设备温度监控等领域。 20.1.2 引脚功能 18B20 引脚功能如下图所示&#xff0c;需要特别强调的是&#xff0c;18B20 采用 1-…...

【C++】17. 多态

上一章节中我们讲了C三大特性的继承&#xff0c;这一章节我们接着来讲另一个特性——多态 1. 多态的概念 多态(polymorphism)的概念&#xff1a;通俗来说&#xff0c;就是多种形态。多态分为编译时多态(静态多态)和运行时多态(动态多态)&#xff0c;这里我们重点讲运行时多态…...

Excel的详细使用指南

### **一、Excel基础操作** #### **1. 界面与基本概念** - **工作簿&#xff08;Workbook&#xff09;**&#xff1a;一个Excel文件&#xff08;扩展名.xlsx&#xff09;。 - **工作表&#xff08;Worksheet&#xff09;**&#xff1a;工作簿中的单个表格&#xff08;默认名…...

没经过我同意,flink window就把数据存到state里的了?

欢迎关注我 不知道大家在初次使用Flink的时候&#xff0c;是否对Flink中定义本地变量和状态比较好奇&#xff0c;这俩有啥区别&#xff1f; 而且在使用Window API时明明没有显式地创建状态&#xff0c;也没调用getState()&#xff0c;却依然把每个窗口里的所有元素都自动缓存…...

Python+OpenCV打造AR/VR基础框架:从原理到实战的全链路解析

引言&#xff1a;重新定义数字与现实的边界 在元宇宙概念持续升温的当下&#xff0c;AR&#xff08;增强现实&#xff09;与VR&#xff08;虚拟现实&#xff09;技术正成为连接物理世界与数字世界的桥梁。Python凭借其丰富的计算机视觉生态&#xff08;尤其是OpenCV库&#xf…...

家用或办公 Windows 电脑玩人工智能开源项目配备核显的必要性(含 NPU 及显卡类型补充)

一、GPU 与显卡的概念澄清 首先需要明确一个容易误解的概念&#xff1a;GPU 不等同于显卡。 显卡和GPU是两个不同的概念。 【概念区分】 在讨论图形计算领域时&#xff0c;需首先澄清一个常见误区&#xff1a;GPU&#xff08;图形处理单元&#xff09;与显卡&#xff08;视…...

实现一个简单的 TCP 客户端/服务器

注意&#xff1a; TCP 三次握手建立连接建立连接后&#xff0c;TCP 提供全双工的通信服务&#xff0c;也就是在同一个连接中&#xff0c;通信双方 可以在同一时刻同时写数据&#xff0c;相对的概念叫做半双工&#xff0c;同一个连接的同一时刻&#xff0c;只能由一方来写数据T…...

对抗帕金森:在疾病阴影下,如何重掌生活主动权?

帕金森病&#xff0c;一种影响全球超 1000 万人的神经退行性疾病&#xff0c;正无声地改变着患者的生活轨迹。随着大脑中多巴胺分泌减少&#xff0c;患者逐渐出现肢体震颤、肌肉僵硬、步态迟缓等症状&#xff0c;甚至连扣纽扣、端水杯这类日常动作都变得艰难。更棘手的是&#…...

鸿蒙 UIAbility组件与UI的数据同步和窗口关闭

使用 EventHub 进行数据通信 Stage模型概念图 根据 Stage 模型概念图 UIAbility 先于 ArkUI Page 创建 所以&#xff0c;事件要先 .on 订阅 再 emit 发布 假如现在有页面 Page1 和他的 UIAbility // src/main/ets/page1ability/Page1Ability.ets onCreate(want: Want, laun…...

DeepSeek 赋能汽车全生态:从产品到服务的智能化跃迁

目录 一、引言二、DeepSeek 助力汽车产品介绍与推广2.1 新车性能参数与技术亮点宣传文案2.2 汽车品牌故事与文化内涵挖掘2.3 汽车广告创意与宣传方案设计 三、DeepSeek 赋能汽车售后服务支持3.1 汽车维修保养知识科普文章创作3.2 常见故障诊断与解决方案生成3.3 汽车用户个性化…...

MQTT 在Spring Boot 中的使用

在 Spring Boot 中使用 MQTT 通常会借助 Spring Integration 项目提供的 MQTT 支持。这使得 MQTT 的集成可以很好地融入 Spring 的消息驱动和企业集成模式。 以下是如何在 Spring Boot 中集成和使用 MQTT 的详细步骤&#xff1a; 前提条件&#xff1a; MQTT Broker&#xff…...

Vue3学习(组合式API——计算属性computed详解)

目录 一、计算属性computed。 Vue官方提供的案例。(普通写法与计算属性写法) 使用计算属性computed重构——>简化描述响应式状态的复杂逻辑。 &#xff08;1&#xff09;计算属性computed小案例。 <1>需求说明。&#xff08;筛选原数组——>得新数组&#xff09; &…...

Spring 中的 @ComponentScan注解详解

在 Spring 框架中,@ComponentScan 是一个非常重要的注解,它用于自动扫描和注册 Bean。通过该注解,Spring 能够自动发现并管理标注了特定注解的类(如 @Component, @Service, @Repository 等),从而实现依赖注入和容器管理。 本文将详细介绍 @ComponentScan 的作用、常见搭…...

MySQL 数据库故障排查指南

MySQL 数据库故障排查指南 本指南旨在帮助您识别和解决常见的 MySQL 数据库故障。我们将从问题识别开始&#xff0c;逐步深入到具体的故障类型和排查步骤。 1. 问题识别与信息收集 在开始排查之前&#xff0c;首先需要清晰地了解问题的现象和范围。 故障现象&#xff1a; 数…...

Android Studio 模拟器配置方案

Android Studio 模拟器配置方案 1.引言2.使用Android Studio中的模拟器3.使用国产模拟器1.引言 前面介绍【React Native基础环境配置】的时候需要配置模拟器,当时直接使用了USB调试方案,但是有些时候可能不太方便连接手机调试,比如没有iPhone调不了ios。接下来说明另外两种可…...

k8s中ingress-nginx介绍

1. 介绍 Ingress是一种Kubernetes资源&#xff0c;用于将外部流量路由到Kubernetes集群内的服务。与NodePort相比&#xff0c;它提供了更高级别的路由功能和负载平衡&#xff0c;可以根据HTTP请求的路径、主机名、HTTP方法等来路由流量。可以说Ingress是为了弥补NodePort在流量…...

键盘输出希腊字符方法

在不同操作系统中&#xff0c;输出希腊字母的方法有所不同。以下是针对 Windows 和 macOS 系统的详细方法&#xff0c;以及一些通用技巧&#xff1a; 1.Windows 系统 1.1 使用字符映射表 字符映射表是一个内置工具&#xff0c;可以方便地找到并插入希腊字母。 • 步骤&#xf…...

字节DeerFlow开源框架:多智能体深度研究框架,实现端到端自动化研究流程

&#x1f98c; DeerFlow DeerFlow&#xff08;Deep Exploration and Efficient Research Flow&#xff09;是一个社区驱动的深度研究框架&#xff0c;它建立在开源社区的杰出工作基础之上。目标是将语言模型与专业工具&#xff08;如网络搜索、爬虫和Python代码执行&#xff0…...

MySQL 存储函数[特殊字符] VS 存储过程[特殊字符]

1、存储函数&#x1f638; 一、存储函数概述 存储函数是MySQL中一种特殊的存储程序&#xff0c;具有以下特点&#xff1a; 返回单个值&#xff1a;必须通过RETURN语句返回明确的结果SQL表达式使用&#xff1a;可以直接在SQL语句中调用输入参数&#xff1a;只接受输入参数(隐…...

reactor实现TCP遇到的问题和探究

struct conn{ int fd; char rbuffer[1024]; char wbuffer[1024]; int wlength; int rlength; int (*recv_cb)(int); int (*send_cb)(int); }; int (*recv_cb)(int); recv_cb&#xff1a;函数指针的名称*recv_cb&#xff1a;星号 * 表示 recv_cb 是一个指针。(*recv_cb)&#…...

ElasticSearch重启之后shard未分配问题的解决

以下是Elasticsearch重启后分片未分配问题的完整解决方案&#xff0c;结合典型故障场景与最新实践&#xff1a; 一、快速诊断定位 ‌检查集群状态 GET /_cluster/health?pretty # status为red/yellow时需关注unassigned_shards字段值 ‌ 2.查看未分配分片详情 …...