在Qt中有一个 QElapsedTimer类,QElapsedTimer 类提供了一种计算经过时间的快速方法。,以毫秒为单位。
QElapsedTimer 类通常用于快速计算两个事件之间经过的时间。它的 API 与 QTime 的 API 相似,因此可以将使用它的代码快速移植到新类中。 然而,与 QTime 不同的是,QElapsedTimer 尽可能尝试使用单调时钟。这意味着不可能将 QElapsedTimer 对象转换为人类可读的时间。 该类的典型用例是确定在慢速操作中花费了多少时间。这种情况的最简单示例是出于调试目的,如下例所示:
QElapsedTimer timer;
timer.start();
slowOperation1();
qDebug() << "The slow operation took" << timer.elapsed() << "milliseconds";
在这个例子中,定时器是通过调用 start() 来启动的,经过的时间是由 elapsed() 函数计算出来的。 在第一个操作完成后,经过的时间也可用于重新计算可用于另一个操作的时间。当执行必须在特定时间段内完成但需要几个步骤时,这很有用。 QIODevice 及其子类中的 waitFor 类型函数就是这种需求的好例子。在这种情况下,代码可能如下所示:
void executeSlowOperations(int timeout)
{
QElapsedTimer timer;
timer.start();
slowOperation1();
int remainingTime = timeout - timer.elapsed();
if (remainingTime > 0)
slowOperation2(remainingTime);
}
另一个用例是针对特定时间片执行特定操作。为此,QElapsedTimer 提供了 hasExpired() 便利函数,该函数可用于确定是否已经过去了一定的毫秒数:
void executeOperationsForTime(int ms)
{
QElapsedTimer timer;
timer.start();
while (!timer.hasExpired(ms))
slowOperation1();
}
在这种情况下,使用 QDeadlineTimer 通常更方便,它计算未来的超时而不是跟踪经过的时间。
测试代码如下:
#include <QCoreApplication>
#include <QElapsedTimer>
#include <QDebug>
void slowOperation1()
{
long long total = 0;
for (int i = 0; i <= 10000000; i++)
{
total += i * 3;
}
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QElapsedTimer timer;
timer.start();
slowOperation1();
double ms = timer.elapsed();
qDebug() << "The slow operation took" << ms << "milliseconds";
return a.exec();
}
运行结果如下:
The slow operation took 62 milliseconds