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

qt 定时器用法

在qt开发中,定时器是我们经常用到的。我们接下来说一下定时器的三种用法,需要注意的是定时器事件是在主线程中触发的,因此在处理耗时操作时应特别小心,以避免阻塞应用程序的事件循环。

1. 三种定时器使用

1.1 QObject的定时器

使用startTimer()函数启动一个定时器,并在派生类中实现timerEvent(QTimerEvent*)函数来处理定时器事件,所以我们要重写 void timerEvent(QTimerEvent* ev)函数,如:

/*
my_class.h
*/
// 在头文件中声明
protected:void timerEvent(QTimerEvent* ev);/*
my_class.cpp
*/
// 在派生类中
void MyClass::timerEvent(QTimerEvent *event) {if (event->timerId() == m_timerId) {// 处理定时器事件} else {// 处理其他定时器事件}
}// 启动定时器(可放在构造函数里)
m_timerId = startTimer(1000); // 每1000毫秒触发一次定时器事件

1.2 QTimer类:

创建一个QTimer对象,然后使用start()函数来启动定时器,使用timeout()信号连接到槽函数来处理定时器超时事件。如:

QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &MyClass::onTimeout);
timer->start(1000); // 每1000毫秒触发一次定时器超时事件// 槽函数
void MyClass::onTimeout() {// 处理定时器超时事件
}

1.3 单次定时器:

当只需要定时器触发一次时,可以使用setSingleShot(true)来设置定时器为单次模式。如:

QTimer *timer = new QTimer(this);
timer->setSingleShot(true); // 设置为单次定时器
connect(timer, &QTimer::timeout, this, &MyClass::onTimeout);
timer->start(1000); // 在1000毫秒后触发一次定时器超时事件// 槽函数
void MyClass::onTimeout() {// 处理定时器超时事件
}

2 定时器阻塞主线程问题

当定时器处理耗时操作时,为了不阻塞主线程,可以考虑以下方法:

  • 使用多线程:将耗时操作放在单独的线程中执行,以避免阻塞主线程。在定时器触发时,启动一个新线程执行耗时操作,这样定时器事件处理和主线程可以同时进行。

  • 异步操作:使用异步操作来执行耗时操作,例如使用异步函数、Promise或回调函数。在定时器事件触发时,调用相应的异步操作来执行耗时任务,它们会在后台执行,而主线程可以继续执行其他任务。

  • 分解任务:将耗时操作分解为多个较小的子任务,并在定时器事件触发时,每次执行一个子任务。这样可以避免长时间的单一操作阻塞主线程,而是将任务划分为多个短时间的操作,使得主线程能够处理其他任务。

无论使用哪种方法,重要的是确保定时器事件的处理不会导致主线程的阻塞,保持应用的响应性和流畅性。

http://www.lryc.cn/news/254433.html

相关文章:

  • 用23种设计模式打造一个cocos creator的游戏框架----(九)访问者模式
  • 根文件系统初步测试
  • 【精选】设计模式——策略设计模式-两种举例说明,具体代码实现
  • 外包干了3个月,技术倒退2年。。。
  • 微信小程序:chooseimage从本地相册选择图片或使用相机拍照
  • 「Swift」取消UITableView起始位置在状态栏下方开始
  • android高版本适配使用Tools.java
  • 面试官:说说webpack中常见的Loader?解决了什么问题?
  • 【蓝桥杯省赛真题50】Scratch智能计价器 蓝桥杯scratch图形化编程 中小学生蓝桥杯省赛真题讲解
  • 折半查找(数据结构实训)
  • AR助推制造业智能转型:实时远程协作与可视化引领生产创新
  • 【用unity实现100个游戏之18】从零开始制作一个类CSGO/CS2、CF第一人称FPS射击游戏——基础篇3(附项目源码)
  • sed 流式编辑器
  • Linux shell编程学习笔记33:type 命令
  • 【数据结构】—红黑树(C++实现)
  • 内衣洗衣机和手洗哪个干净?高性价比内衣洗衣机推荐
  • TikTok与互动广告:品牌如何打破传统界限
  • 跟着Nature Communications学习Hisat-Trinity-PASA等分析流程
  • Unity中Batching优化的动态合批
  • 2022年第十一届数学建模国际赛小美赛B题序列的遗传过程解题全过程文档及程序
  • 【Linux】静态库与动态库制作及运行原理
  • 工具站推荐
  • 【JS】toFixed()无法精准保留小数的解决方案
  • vue3版本学习
  • 【WPF.NET开发】创建简单WPF应用
  • 视频智能分析国标GB28181云平台EasyCVR加密机授权异常是什么原因?
  • Mysql安全之基础合规配置
  • 前后端分离项目跨域请求
  • OpenEuler系统桌面终端设置字体
  • repo常用命令解析(持续更新)