1. 程式人生 > >Visual Studio C++精確計時

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