頭檔案聲明(CTimer.h):
#pragma once
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <mmsystem.h>
class CTimer
{
public:
CTimer();
~CTimer();
void ResetTimer(); // 重設計時器,重新開始計時
unsigned __int64 GetTimerDifference(); // 計算時差,傳回毫秒差
unsigned __int64 GetTimerDifference(unsigned __int64 t0, unsigned __int64 t1); // 計算時差,傳回毫秒差
private:
unsigned __int64 StartTimer(); // 啟動計時器
unsigned __int64 GetTimer(); // 擷取目前時鐘
protected:
private:
unsigned __int64 m_tmStart;
BOOL m_bInitialize;
BOOL m_bHigh;
signed __int64 m_hpFrequency;
};
源檔案實作(CTimer.cpp):
#include "stdafx.h"
#include "CTimer.h"
CTimer::CTimer()
{
if (!m_bInitialize) {
if (::timeBeginPeriod(1) == TIMERR_NOERROR)
m_bInitialize = TRUE;
}
m_hpFrequency = 10000000;
if (::QueryPerformanceFrequency((LARGE_INTEGER*)&m_hpFrequency)) {
m_bHigh = TRUE;
}
StartTimer();
}
CTimer::~CTimer()
{
if (m_bInitialize) {
::timeEndPeriod(1);
m_bInitialize = FALSE;
}
}
// 重設計時器,重新開始計時
void CTimer::ResetTimer()
{
StartTimer();
}
// 計算時差,傳回毫秒差
unsigned __int64 CTimer::GetTimerDifference()
{
unsigned __int64 m_tmStop = GetTimer();
return GetTimerDifference(m_tmStart, m_tmStop);
}
// 計算時差,傳回毫秒差
unsigned __int64 CTimer::GetTimerDifference(unsigned __int64 t0, unsigned __int64 t1)
{
if (m_bHigh) {
return trunc(abs((FLOAT)(1000.0*(double)(t1 - t0) / (double)m_hpFrequency)));
}
return trunc(abs((FLOAT)(t1 - t0)*1000.0f));
}
// 啟動計時器
unsigned __int64 CTimer::StartTimer()
{
m_tmStart = GetTimer();
return m_tmStart;
}
// 擷取目前時鐘
unsigned __int64 CTimer::GetTimer()
{
if (m_bHigh) {
signed __int64 freq;
::QueryPerformanceCounter((LARGE_INTEGER*)&freq);
return freq;
}
return (signed __int64)::timeGetTime();
}