现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

QTimer,QTime的一点应用

2014-08-15 06:58 工业·编程 ⁄ 共 1848字 ⁄ 字号 暂无评论

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

给我留言

留言无头像?