欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Qt-定时器QTimer

程序员文章站 2024-03-22 18:51:52
...

QTimer

1.设计一个每秒钟都触发的计时器

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

举例来说,一个1秒(1000毫秒)的计时器(从模拟时钟例子):

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

从那时起,每秒钟都会调用update()槽。

2.设计一个只触发一次的计时器

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

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

3.跨线程使用计时器

在多线程应用程序中,可以在任何具有事件循环的线程中使用QTimer。要从非gui线程启动事件循环,请使用QThread::exec()。Qt使用计时器的线程关联来确定哪个线程将发出timeout()信号。因此,您必须在其线程中启动和停止计时器;不可能从另一个线程启动计时器。

作为一种特殊情况,超时为0的QTimer将在窗口系统的事件队列中处理完所有事件后立即超时。这可以用来做繁重的工作,同时提供一个时髦的用户界面:

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可能会比预期更早唤醒,这些类型的唤醒时间间隔在Qt::CoarseTimer的:5%和Qt::VeryCoarseTimer的500ms之间。如果系统繁忙或无法提供所要求的准确性,所有计时器类型都可能超时,比预期的时间要晚。在这种超时超时的情况下,即使多个超时已经过期,Qt也只会发出一次activated(),然后恢复原来的间隔。

 

 

 

 

 

 

 

 

相关标签: Qt基础