Qt之Timers
简述
QObject是所有Qt objects的基类,在Qt中提供了基础定时器的支持。使用QObject::startTimer(),你可以传递一个毫秒数间隔作为参数启动一个定时器。该函数返回一个唯一的整数timer ID,计时器会定时触发,直到你显式地传递timer ID调用QObject::killTimer()。
对于这种工作机制,应用程序必须在事件循环(event loop)中运行,使用QApplication::exec()启动一个事件循环。当一个定时器触发时,应用程序会发送一个QTimerEvent,并且控制流离开事件循环,直到定时器事件被处理。这意味着,当你的应用程序正忙着做别的事情时,定时器不能触发。换句话说,计时器的精度取决于应用程序的粒度。
在多线程应用程序中,你可以在有一个事件循环的任何线程中使用定时器机制。要从一个非GUI线程启动事件循环,使用QThread::exec()。Qt使用对象的线程关联来确定哪个线程将传送QTimerEvent。正因如此,你必须启动和停止该对象的线程的所有计时器,不可能在另一个线程的对象中启动定时器。
详细说明
主要的计时器功能API在QTimer中,这个类提供了常规的定时器。当定时器触发就会发射信号,而继承自QObject以便适合大多数GUI程序的所有权结构。正常使用它的方法是这样的:
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(updateCaption()));
timer->start(1000);
QTimer对象作为这个部件的孩子,当此部件被删除时,计时器也被删除。接下来,连接timeout()信号与槽函数,以1000毫秒的间隔启动定时器,表明它将每秒钟都会超时。
QTimer还为单次触发定时器提供了一个静态函数。例如:
QTimer::singleShot(200, this, SLOT(updateCaption()));
在这行代码执行后200毫秒(0.2秒),updateCaption()槽将被调用。
为了让QTimer可以运行,你必须在应用程序中有一个事件循环;也就是说,你必须在某个地方调用QCoreApplication::exec(),定时器事件只在事件循环运行时被传送。
在多线程应用程序中,你可以在有一个事件循环的任何线程中使用QTimer。要从一个非GUI线程启动事件循环,使用QThread::exec()。Qt使用定时器的 thread affinity来确定哪个线程将发射timeout()信号。正因如此,你必须启动和停止计时器在它自己的线程中,不可能在另一个线程的对象中启动定时器。
Analog Clock(模拟时钟)示例说明了如何使用QTimer定期重绘一个部件。AnalogClock的实现:
AnalogClock::AnalogClock(QWidget *parent)
: QWidget(parent)
{
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(1000);
...
}
每一秒钟,QTimer就会调用QWidget::update()槽函数刷新时钟的显示。
如果你已经有了一个QObject子类,并希望有一个简单的优化,可以使用QBasicTimer代替QTimer。使用QBasicTimer,必须在你的QObject子类中重写timerEvent()并且处理超时。Wiggly示例说明如何使用QBasicTimer。
更多参考
- Timers - 助手
- Qt之模拟时钟
Qt之Timers的更多相关文章
- 《Qt 实战一二三》
简介 "我们来自Qt分享&&交流,我们来自Qt Quick分享&&交流",不管你是笑了,还是笑了,反正我们是认真的.我们就是要找寻一种Hold不住的 ...
- QObject::startTimer: timers cannot be started from another thread 一则输出调试:关于QT的线程关联性
开始 今天在调试输出里看见QObject::startTimer: timers cannot be started from another thread QTimer类 从Qt的帮助文档里可以得到 ...
- Qt事件处理机制
研一的时候开始使用Qt,感觉用Qt开发图形界面比MFC的一套框架来方便的多.后来由于项目的需要,也没有再接触Qt了.现在要重新拾起来,于是要从基础学起. Now,开始学习Qt事件处理机制. 先给出原文 ...
- Qt 控制watchdog app hacking
/************************************************************************** * Qt 控制watchdog app hack ...
- Qt源码分析之QObject
原文:http://blog.csdn.net/oowgsoo/article/details/1529284 我感觉oowgsoo兄弟写的分析相当透彻,赞! 1.试验代码: #include < ...
- Qt源码分析之QPointer
QPointer是一个指针封装类,其作用类似于智能指针,但是它最大的特点应该是在指针的控制上,它希望一个Qt的指针(当然是从QObject派生的)可以同时被多个类拥有,这在界面编程中当然是很常见的事情 ...
- 剖析Qt的事件机制原理
版权声明 请尊重原创作品.转载请保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正. QT源码解析(一) QT创建窗口程序.消息循环和WinMai ...
- Qt经典—线程、事件与Qobject(耳目一新)
介绍 You’re doing it wrong. — Bradley T. Hughes 线程是qt channel里最流行的讨论话题之一.许多人加入了讨论并询问如何解决他们在运行跨线程编程时所遇到 ...
- 转:QT 的点点滴滴 错误总结
转自:http://blog.csdn.net/lbsljn/archive/2009/12/29/5099590.aspx MinGw + CodeBlock + QT4.5 类定义后面要加&quo ...
随机推荐
- BZOJ 2879 美食节(费用流-动态加边)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2879 题意:有n道菜,每道菜需要b[i]份,m个厨师,第j个厨师做第i道菜需要时间a[i ...
- 折半查找&clock函数
#include <stdio.h>#include <time.h> #define CLOCKS_PER_SEC ((clock_t)1000) int binsearch ...
- JAVA操作数组
使用 Arrays 类操作 Java 中的数组 Arrays 类是 Java 中提供的一个工具类,在 java.util 包中.该类中包含了一些方法用来直接操作数组,比如可直接实现数组的排序.搜索等 ...
- 微博传播数量和传播深度的预测--基于pyspark和某个回归算法
8-28决定参加一下这个千万条的数据处理任务,因为场景和自己做过的一个回归分析预测差不多,第一天开始在小规模的数据上做准备工作. 第二次大修改版本 date 20160829 星期一¶ 原始数据处理, ...
- MQ使用几个命令
一.MQ常见基本指令: MQ现在使用的比较常见,但是在测试过程中,使用命令行直接查询,有时候事半功倍. activemq-admin stop activemq-admin list activemq ...
- Debian8系统下,caffe的安装
特此声明:本文不允许用于商业目的,允许转载(注明一下啦). 首先,官方的参考文献为:http://caffe.berkeleyvision.org/installation.html. 现在开始: 安 ...
- 【Todo】【读书笔记】大数据Spark企业级实战版 & Scala学习
下了这本<大数据Spark企业级实战版>, 另外还有一本<Spark大数据处理:技术.应用与性能优化(全)> 先看前一篇. 根据书里的前言里面,对于阅读顺序的建议.先看最后的S ...
- Android最佳性能实践(一)——合理管理内存
有不少朋友都问过我,怎样才能写出高性能的应用程序,如何避免程序出现OOM,或者当程序内存占用过高的时候该怎么样去排查.确实,一个优秀的应用程序,不仅仅要功能完成得好,性能问题也应该处理得恰到好处.为此 ...
- Android网络编程系列 一 TCP/IP协议族之网际层
这篇借鉴的文章主要是用于后续文章知识点的扩散,在此特作备份和扩散学习交流. 网际层包括:IP.ICMP.IGMP 以及处在网际层实际工作在链路层的 ARP 和 RARP等等协议. 1.IP协议 互联网 ...
- 这个算asp.net的一个bug吗?
asp.net设置按钮Enabled="false"后OnClientClick中添加的验证脚本消失了 下面的确可以 <asp:Button ID="btnRegi ...