头文件声明(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();
}