Visual Studio C++精确计时

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毫秒

猜你喜欢

转载自blog.csdn.net/liji_digital/article/details/82119523