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