QT定时任务- timerEvent事件使用以及和QTimer 定时器的使用区别

2023-05-16

定时器QTimer和timerEvent事件重载的使用区别记录

  • QTimer定时器
  • QObject中的timerEvent事件重载-QObject定时器
  • 总结
  • 参考文章

QTimer定时器

一般情况下我们使用定时器开启定时任务都是这样操作:

//.h文件--声明QTimer对象和槽函数
public slots:
	void Timer_func();
public:
	QTimer* Timer_;	

//.cpp文件--实例化和连接信号槽
Timer_= new QTimer(); 
Timer_->setInterval(6000);	//6s
connect(Timer_, SIGNAL(timeout()), this, SLOT(Timer_func()));
Timer_->start();

这样做很明确,且是专门一个信号来触发定时任务,不会导致冲突。但是这需要每一个不同的定时任务对应开一个QTimer。有些对象内部轮询的任务,用QTimer定时就有点麻烦(懒),所以找到了另外一种方法,它就是QObject提供的定时器方法。

QObject中的timerEvent事件重载-QObject定时器

通常使用startTimer()要比QTimer有更好的使用效率,下面是官方文档原话翻译,节选自QObject class里的startTimer()函数下方注解。

启动计时器并返回一个计时器标识符,如果不能启动计时器则返回零。
计时器事件将每隔毫秒发生一次,直到调用killTimer()。
如果标识符返回interval为0,则计时器事件在每次没有更多窗口系统事件需要处理时发生一次。
当计时器事件发生时,使用QTimerEvent事件参数类调用虚拟timerEvent()函数。
重载此函数以获取计时器事件。
如果有多个计时器在运行,QTimerEvent::timerId()可以用来找出哪个计时器被激活了。

所有继承自QObject的类,都会有一个timerEvent(QTimerEvent *event)的纯虚函数,我们只需要继承QObject,然后再重载这个函数以实现自己的定时功能。

 void timerEvent(QTimerEvent *event) override;  可以加override ,表示覆盖

.h文件内定义定时器ID:
在这里插入图片描述
.cpp 文件中重载timerEvent,使用startTimer(timerId)开启定时器,使用killTimer(timerId)关闭定时器。逻辑里通过验证timeID实现不同功能:
在这里插入图片描述
Delay_MSec(INT msec)实现了QT中的非阻塞延时,非常好用,适合在对象内部自延时而不卡住其他事件(如界面事件)。

void MainWindow::Delay_MSec(unsigned int msec)
{
    QTime _Timer = QTime::currentTime().addMSecs(msec); // 在当前的时间上增加多少秒
    while( QTime::currentTime() < _Timer ) // while循环
    QCoreApplication::processEvents(QEventLoop::AllEvents, 100);// 期间在做主事件循环,就避免了阻塞
	// 去掉这句就是阻塞延时了
}


另外,timerEvent事件最好不要处理过久,因为如果这个事件函数被占用了,下一次的startTimer定时器事件也会无法响应。这有点类似STM32中的中断函数,中断函数不允许处理时间过长,否则会导致中断阻塞,功能不稳定。
示例,大家也可以自己做测试:
在这里插入图片描述

图片文字里的32秒是错的 ,应该是33秒,小错误忽略掉就好~


总结

QTimer适用性相对较广,因为它的使用一般是基于信号与槽,所以可通过信号或槽的多级绑定以实现更为复杂的定时任务。且可以同一时间被触发多次。

timerEvent事件则适用面相对较窄,因为实现它是继承和重载,这就意味着只有该类生成的对象能使用到这个定时事件,因为它们都在同一块内存空间中(同一个对象内),比如我A类重载了timerEvent,A类内部有个B类,则我可以通过A类对象的timerEvent来触发B类的定时操作。这非常适合在较少工作量的定时轮询场景中使用。但是timerEvent不允许占用时间过长,否则事件触发被阻塞,导致功能不稳定。

提一嘴,QT 中,信号与槽是否是同一条线程要看connect函数的第五个参数。
直接连接是信号发出同时 立刻执行 槽函数,跟回调类似,是在同一条线程。执行完槽函数才会继续往下执行。
队列连接发出信号后,信号会放到接收方的事件队列 等待执行 ,并不是同一条线程,等接收方空闲事件循环才会调用槽函数。
自动连接 这是默认参数,让Qt自行选择。如果信号发送方和接收方在同一线程中,就使用直接连接;否则使用队列连接。
简单理解:把直连当成同步,信号发出立刻调用槽;队列当成异步,等接收方空闲下来才会处理。(如果实在需要立刻响应,就调用QCoreApplication::processEvents())


参考文章

参考文章- Qt中QTimer和timerevent的区别与用法
参考文章- QObject的timerEvent使用
参考文章- 关于Qt中常用的延时方法–自我总结

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT定时任务- timerEvent事件使用以及和QTimer 定时器的使用区别 的相关文章

  • 华为交换机链路聚合命令

    配置链路聚合 1 创建聚合组 sys interface eth trunk 2 2 配置聚合模式为手工模式 interface eth trunk 2 mode manual load balance 表示手工模式 mode lacp l
  • VC EXE程序删除自身

    在开发程序过程中 xff0c 有许多情况中都需要执行程序自己把自己从物理磁盘上删除 xff0c 例如 xff0c 卸装程序 xff0c 一些黑客程序获取信息后自清除等 xff0c 我们把这些具有自删除功能的程序统称为 自杀 程序 对于一名程
  • 理解WinRT

    WinRT Windows Runtime 是微软新一代在Win8 Metro下开发框架 xff0c 它是一套面向对象 跨语言并且是Native的库 如果有人问我WinRT的核心技术是什么 xff1f 我的答案是 COM 43 Net Me
  • vim 基本使用

    vim 下基本命令 重新加载 vimrc source vimrc 列出当前缓冲区的所有文档 ls 然后使用 b 43 编号 移至该文档 选中多行 v 43 shift 然后 j k 上下移动 缩进单行 gt gt lt lt 当前行到结尾
  • hashcode()和equals()的作用、区别、联系

    介绍一 hashCode 方法和equal 方法的作用其实一样 xff0c 在Java里都是用来对比两个对象是否相等一致 xff0c 那么equal 既然已经能实现对比的功能了 xff0c 为什么还要hashCode 呢 xff1f 因为重
  • c语言文件中存入/读取double型矩阵型数据

    test c Created on Jun 1 2019 Author lgh include lt stdio h gt include lt stdlib h gt double allocation memory double int
  • windows自动更新变成了灰色,不能选择的原因

    现象 发现我的电脑 属性 自动更新里面所有的按钮都已经是灰色的了 xff0c 而且每次开机都会自动运行自动更新 xff0c 关闭进程也无法停止 xff0c 几秒钟后又会开始更新 xff0c 而且更新后会要求重新启动 控制面板里的安全中心显示
  • 在 Debian Stretch 上安装 FFmpeg

    FFmpeg 是一款流行的多媒体框架 xff0c 可以用来记录 转换数字音频 视频 xff0c 并能将其转化为流的开源计算机程序 采用LGPL或GPL许可证 它提供了录制 转换以及流化音视频的完整解决方案 它包含了非常先进的音频 视频编解码
  • MHA使用手册一:概述(基于0.56版本)

    本文基于MHA官方文档0 56版wiki翻译而成 原文链接 xff1a https github com yoshinorim mha4mysql manager wiki 概述 概述 MHA以最少的停机时间 xff08 通常在10 30秒
  • 海思开发板FFmpeg+Nginx,推流RTMP播放(优秀教程收集+实操整理)

    海思开发板FFmpeg 43 Nginx推流RTSP播放 xff08 优秀教程收集 43 实操整理 xff09 安装FFmpeg及移植FFmpeg编译问题收录 xff1a static declaration of 39 cbrt 39 f
  • mysql配置文件详解

    basedir 61 path使用给定目录作为根目录 安装目录 character sets dir 61 path给出存放着字符集的目录 datadir 61 path从给定目录读取数据库文件 pid file 61 filename为m
  • 华测服务器进不去系统,华测云服务器如何登陆

    华测云服务器如何登陆 内容精选 换一换 当您拥有一台专属主机后 xff0c 您可以在专属主机上创建相应规格族的云服务器 在专属主机上创建云服务器前 xff0c 您必须先完成以下工作 xff1a 购买专属主机如果不使用系统自动创建的默认安全组
  • 七牛云存储 CDN 使用指南

    七牛cdn 使用指南 更新于2016 3 13 分为两种情况 xff1a 1 使用七牛存储 2 直接使用七牛cdn 一 使用七牛存储 xff08 七牛的存储默认使用cdn加速 xff09 静态资源存储到七牛后 xff0c 可以使用七牛提供的
  • 如何在 Debian 中安装 DHCP 服务器

    动态主机配置协议 xff08 DHCP xff09 是一种用于使主机能够从服务器自动分配 IP 地址和相关的网络配置的网络协议 DHCP 服务器分配给 DHCP 客户端的 IP 地址处于 租用 状态 xff0c 租用时间通常取决于客户端计算
  • 重磅更新:码云企业版之项目多仓库功能上线!!!

    开发四年只会写业务代码 xff0c 分布式高并发都不会还做程序员 xff1f 现在的软件开发是越来越复杂了 xff0c 以前讲系统化 模块化 xff0c 现在讲微服务化 xff0c 前后端分离 xff0c 各种编程语言混搭 xff0c 还有
  • tracking 问题解决

    1 dir 或者C 43 43 函数读文件名 xff0c 不推荐 搞乱了名字 2 matio读写矩阵 转载于 https www cnblogs com Wanggcong p 5651081 html
  • Docker系列07—Dockerfile 详解

    Docker系列07 Dockerfile 详解 1 认识Dockerfile 1 1 镜像的生成途径 基于容器制作 dockerfile xff0c docker build 基于容器制作镜像 xff0c 已经在上篇Docker系列06
  • Linux SWAP 深度解读

    概述 本文讨论的swap基于Linux4 4内核代码 Linux内存管理是一套非常复杂的系统 xff0c 而swap只是其中一个很小的处理逻辑 希望本文能让读者了解Linux对swap的使用大概是什么样子 阅读完本文 xff0c 应该可以帮
  • QT QByteArray的十进制与十六进制(字符型) 互相转换 -串口编程

    串口使用中会经常用到 目前使用到的是QByteArray number 源数据 xff0c 目标输出的进制 作下记录 xff0c 以供日后参考 转制方法有很多 xff0c 这只是其中一种 xff0c 有其他QT的进制转换方法 xff0c 欢
  • Ubuntu系统上All-in-one部署OpenStack

    虚拟机软件 xff1a VMware Workstaion12 操作系统 xff1a Ubuntu14 04 1 修改Ubuntu14 04的apt源为国内的阿里源 xff1a cp etc apt sources list etc apt

随机推荐