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