QTimer,QTime的一点应用

QTime可以及时流逝的时间

QTimer是“时机”;什么时间发生什么时候,发出一个SIGNAL,执行一个SLOT

 

例子1

#include<QtGui>
#include<windows.h>
#include<vector>
int main(int argc,char* argv[])
{
 
 QApplication app(argc,argv);


 std::vector<int> list;

 QTime tim;
 tim.start();
 for(int i=0; i<10; i++)
 {
  Sleep(100);
  list.push_back(tim.elapsed() );
 }
 for(quint32 i=0; i<list.size(); i++)
 {
  printf("%d ", list.at(i));
 }
 printf("/n");

 return app.exec();
}

则输出为,109 203 312 406 516 609 703 812 906 1016

计算一下邻差  94 109 94 110 93 94 109 94 110
差不多, 基本维持在100毫秒的延时,这基本说明Sleep的精度,也说明QTime的用法之一。

 

例子2:

----------------------timeout.h-----------

#include <QtCore>
class TIMEOUT:public QObject
{
 Q_OBJECT
 private:
  QTime t;
 public:
  TIMEOUT()
  {
   t.start();
  }
  public slots:
  void timeout()
  {
   qDebug("%d ", t.elapsed() );
  }
};

---------------------main.cpp-------------

#include "timeout.h"
int main(int argc,char* argv[])
{
 
 QApplication app(argc,argv);


 std::vector<int> list;

 QTimer timer;
 timer.start(100);

 TIMEOUT out;
 QObject::connect(&timer,SIGNAL(timeout()), &out, SLOT(timeout()));

 for (int i=0; i<6;i++)
 {
  Sleep(50);
 // qApp->processEvents();

 }

 

 return app.exec();
}
输出为

312
328
437
547
656
765
875
984
1094
1203
1312
1422
1531
1640
1750
1859
1969
2078
2187
2297
2406
2515
2625
2734

计算一下邻差,

16
109
110
109
109
110
109
110
109
109
110
109
109
110
109
110
109
109
110
109
109
110
109

可见执行Sleep的时候,QTimer是没有机会fire它的signal的;它眼巴巴的等着cpu有空了,才能释放signal;

那么是不是释放了signal,但是调度处理没有时机调用slot呢?也有可能吧,

但外在的表现是一直的,即来不及处理。

When a timer fires, the application sends a QTimerEvent, and the flow of control leaves the event loop until the timer event is processed. This implies that a timer cannot fire while your application is busy doing something else. In other words: the accuracy of timers depends on

the granularity of your application.

       --------------Qt的assistant

 

上面的例子2中,如果反注释  qApp->processEvents();
则输出为

156
250
328
438
547
656
766
875
985
1094
1203
1313
1422
1531
1641
1750
1860
1969
2078
2188

邻差为

94
78
110
109
109
110
109
110
109
109
110
109
109
110
109
110
109
109
110

可见这个qApp->processEvents()的作用了 ,见缝插针,只是第一个sleep和第二个sleep之间没有来得及插针。

 

试图使用QTimer得到固定的,精确的,不依赖于当前任务的时延,是苦难的。

### QTimeQTimer 的区别及用法 #### QTime 的功能与应用场景 QTime 主要用于表示时间和处理时间计算。该类提供了多种方法来获取当前时间、测量时间段以及执行基本的时间运算。例如,可以通过 `currentTime()` 方法获得系统当前时间,并利用 `elapsed()` 或者 `msecsTo(QTime)` 来计算两个时刻之间的差异。 ```cpp // 获取当前时间并打印出来 QTime time = QTime::currentTime(); qDebug() << "Current Time:" << time.toString(); // 计算从某个固定点到现在经过了多少毫秒数 int elapsedMilliseconds = startTime.msecsTo(QTime::currentTime()); qDebug() << "Elapsed Milliseconds since start:" << elapsedMilliseconds; ``` [^3] #### QTimer 的特性及其典型应用场合 相比之下,QTimer 是专为定时任务设计的一个工具,在图形界面编程中非常有用。通过设定间隔时间(单位为毫秒),可以让指定槽函数按照预定频率被调用,从而实现诸如动画效果刷新、周期性的数据查询等功能。下面展示了一个简单的例子说明如何启动和停止一个每秒钟触发一次事件的计时器: ```cpp #include <QApplication> #include <QWidget> #include <QPushButton> #include <QVBoxLayout> class MyWidget : public QWidget { Q_OBJECT public: MyWidget(QWidget* parent = nullptr); private slots: void handleTimeout(); void onStartButtonClicked(); void onStopButtonClicked(); private: QPushButton* m_startButton; QPushButton* m_stopButton; QTimer m_timer; }; MyWidget::MyWidget(QWidget* parent): QWidget(parent), m_startButton(new QPushButton("Start", this)), m_stopButton (new QPushButton("Stop", this)) { QVBoxLayout* layout = new QVBoxLayout(this); connect(m_startButton, &QPushButton::clicked, this , &MyWidget::onStartButtonClicked ); connect(m_stopButton , &QPushButton::clicked, this , &MyWidget::onStopButtonClicked ); connect(&m_timer , &QTimer::timeout , this , &MyWidget::handleTimeout ); layout->addWidget(m_startButton); layout->addWidget(m_stopButton); } void MyWidget::onStartButtonClicked(){ qDebug()<<"Starting Timer..."; m_timer.start(1000); // 启动计时器,每隔一秒发出超时信号 } void MyWidget::onStopButtonClicked(){ qDebug()<<"Stopping Timer..."; m_timer.stop(); // 停止计时器 } void MyWidget::handleTimeout(){ static int count=0; ++count; qDebug()<<QString("Timer ticked %n times.",&count); } ``` [^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值