##由来
今天测试GDI、Direct2D绘图性能时,发现GetTickCount()函数的精度只有15ms左右,而绘制10000个随机点线段所需时间大概也为几十ms,误差比较大,找了下原来有更高精度(1ms)的多媒体定时器可以调用,因此记录下来。
##测试平台
Win10 x64
VS 2010 32位对话框工程
##代码
class HClock
{
public:
HClock();
~HClock();
public:
void StartClock(void);
void EndClock(void);
double GetTime(void);//in ms
protected:
private:
LARGE_INTEGER nFreq;
LARGE_INTEGER nStart;
LARGE_INTEGER nEnd;
};
HClock::HClock()
{
}
HClock::~HClock()
{
}
void HClock::StartClock(void)
{
QueryPerformanceFrequency(&nFreq);
QueryPerformanceCounter(&nStart);
}
void HClock::EndClock(void)
{
QueryPerformanceCounter(&nEnd);
}
double HClock::GetTime(void)
{
return(1000.0*(double)(nEnd.QuadPart-nStart.QuadPart)/(double)nFreq.QuadPart);
}
调用很简单,就不写了
上面的是计时器,下面记录一个1ms级别的定时器用法,没写成类,很简单的可以集成到自定义类里。
首先自己需要的类里声明变量
HANDLE m_hTimerQueue = NULL;
HANDLE m_hTimerQueueTimer = NULL;
再声明函数
static VOID CALLBACK TimerRoutine(PVOID lpParam, BOOLEAN TimerOrWaitFired)
{
if (lpParam == NULL)
{
OutputDebugString(_T("定时器启动错误\n"));
}
else
{
CString dt;
SYSTEMTIME st;
::GetLocalTime(&st);
dt.Format(_T("当前时刻%d:%2d.%d\n"), st.wMinute, st.wSecond, st.wMilliseconds);
OutputDebugString(dt);
}
}
void startTimer()
{
if (m_hTimerQueue == NULL && m_hTimerQueueTimer == NULL)
{
m_hTimerQueue = CreateTimerQueue();
if (m_hTimerQueue != NULL)
{
//TimerRoutine为回调函数
//20ms循环执行
//具体应用可以查看CreateTimerQueueTimer的定义
if (!CreateTimerQueueTimer(&m_hTimerQueueTimer, m_hTimerQueue, TimerRoutine, this, 0, 20, WT_EXECUTEDEFAULT))
{
m_hTimerQueue = NULL;
m_hTimerQueueTimer = NULL;
OutputDebugString(_T("CreateTimerQueueTimer failed.\n"));
}
}
else
{
m_hTimerQueue = NULL;
m_hTimerQueueTimer = NULL;
}
}
}
void stopTimer()
{
if (m_hTimerQueueTimer != NULL)
DeleteTimerQueueTimer(m_hTimerQueue, m_hTimerQueueTimer, INVALID_HANDLE_VALUE);
if (m_hTimerQueue != NULL)
DeleteTimerQueueEx(m_hTimerQueue, INVALID_HANDLE_VALUE);
m_hTimerQueueTimer = NULL;
}
就可以了,使用的时候,在需要的地方
startTimer();//开始定时
stopTimer();//结束