QTimer 定时器-详细介绍

QTimer 类提供重复和单次计时器。

QTimer 类为计时器提供了一个高级编程接口。要使用它,首先创建一个 QTimer实例,将其 timeout() 信号连接到相应的插槽,然后调用 start()。从那时起,它将以恒定的间隔发出 timeout() 信号。

一秒(1000毫秒)计时器的示例(来自模拟时钟示例):

QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(1000);

从那时起,每秒调用一次 update() 槽函数。

也可以通过调用 setSingleShot(true) 将计时器设置为仅超时一次。您还可以使用静态 QTimer::singleShot() 函数在指定的时间间隔后调用槽函数:

QTimer::singleShot(200, this, SLOT(updateCaption()));

在多线程应用程序中,可以在任何具有事件循环的线程中使用 QTimer。要从非 GUI 线程启动事件循环,使用 QThread::exec()。Qt使用计时器的线程亲和力来确定哪个线程将发出timeout()信号。因此,您必须在其线程中启动和停止计时器;无法从另一个线程启动计时器。作为特殊情况timeout 为 0 的 QTimer 将在窗口系统的事件队列中的所有事件都得到处理后立即timeout。这可用于完成繁重的工作,同时提供活泼的用户界面:

QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(processOneThing()));
timer->start();

从那时起,processOneThing()槽函数将被重复调用。它应该以这样一种方式编写,即它总是快速返回(通常在处理一个数据项之后),以便Qt可以将事件传递到用户界面,并在完成所有工作后立即停止计时器。这是在GUI应用程序中实现繁重工作的传统方式,但随着多线程在越来越多的平台上变得可用,我们预计零毫秒QTimer对象将逐渐被QThreads取代。

定时器精度和分辨率

计时器的准确性取决于底层操作系统和硬件。大多数平台都支持 1 毫秒的分辨率,尽管在许多现实情况下,计时器的精度不会等于此分辨率。

精度还取决于计时器类型。对于Qt::PreciseTimer,QTimer将尝试将精度保持在1毫秒。精确的计时器也不会比预期早超时。对于 Qt::CoarseTimer 和 Qt::VeryCoarseTimer 类型,QTimer 可能会比预期更早timeout,在这些类型的范围内:Qt::CoarseTimer 的间隔为 5%,Qt::VeryCoarseTimer 的间隔为 500 毫秒。如果系统繁忙或无法提供请求的准确性,则所有计时器类型都可能晚于预期超时。在timeout 溢出的情况下,Qt只会发出一次active(),即使多个超时已经过期,然后恢复原始间隔。 

后续公众号会发布系列教程,更多内容请关注公众号:程序猿学习日记

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值