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得到固定的,精确的,不依赖于当前任务的时延,是苦难的。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值