VS利用QueryPerformanceCounter语句,提供了精确计时的功能,下面用一个简单的例子来展示其使用办法。
例子中,采用Qt的startTimer函数,实现每隔500毫秒触发一次timerEvent()。但是由于qt的timer并不那么准确,造成timerEvent不能保证精确的按照0.5秒来触发。QueryPerformanceCounter就是用来精确的记下每次触发的时间点。记录的时间点通过qDebug打印出来。
头文件:
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_TimeCounter.h"
#include <QTimerEvent>
#include <Windows.h>//不可少
#include <mmsystem.h>//不可少
class TimeCounter : public QMainWindow
{
Q_OBJECT
public:
TimeCounter(QWidget *parent = Q_NULLPTR);
LARGE_INTEGER m_nBegin;
LARGE_INTEGER m_nFreq;
private:
Ui::TimeCounterClass ui;
protected:
void timerEvent(QTimerEvent *);
};
cpp文件
#include "TimeCounter.h"
#include <qdebug.h>
#pragma comment(lib, "winmm.lib")//不可少
TimeCounter::TimeCounter(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
startTimer(500);
QueryPerformanceFrequency(&m_nFreq);//获取频率
QueryPerformanceCounter(&m_nBegin);//获取起始时间
}
void TimeCounter::timerEvent(QTimerEvent * e)
{
LARGE_INTEGER nTime;
QueryPerformanceCounter(&nTime);//获取时间
//计算从起始时间开始,到当前的时间间隔,单位毫秒
int iInterval = (nTime.QuadPart - m_nBegin.QuadPart) / (double)m_nFreq.QuadPart * 1000;
qDebug() << iInterval<<" ms";
}
效果:
可见,相邻时间点之间的间隔并不严格等于500毫秒