牛骨文教育服务平台(让学习变的简单)

VC++中的计时器及多媒体高精度计时器

Windows计时器是一个非常有用的编程元素,而且计时器的使用非常简单,我们只需要一个时间间隔参数来调用SetTimer函数设置和启动计时器,通过WM_TIMER消息的响应函数进行计时器控制,调用KillTimer函数停止计时器。

但是由于Windows是一个非实时操作系统,所以如果我们定义的时间间隔小于100ms的时候,计时器可能不会很准确。所以,对于有些时间要求比较高的情况,我们需要使用多媒体高精度计时器来完成计时,它的精度可以达到1ms。

下面结合实例详细讲述计时器和多媒体高精度计时器使用方法(完整实例可在我的CSDN资源中下载:http://download.csdn.net/detail/margin1988/8328525

⑴  普通计时器的使用方法:

1> 在.h文件中添加计时器和消息响应函数:

int m_time;//计数器编号
afx_msg void OnTimer(UINT_PTR nIDEvent);

2> 在.cpp文件中添加WM_TIMER的消息响应宏:

int m_count=0;//计时全局计数变量

BEGIN_MESSAGE_MAP (CPoint21Dlg, CDialog)
ON_WM_TIMER() //WM_TIMER消息响应宏
END_MESSAGE_MAP ()

3> 启动计时器:

m_count = 0;
m_time = SetTimer(1,1000,NULL);
ASSERT (m_time != 0);
for (int i=0;i<10000;i++){
//uses up CPU cycles
}
if (::PeekMessage(&msg,NULL,0,0,PM_REMOVE)){
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}

4> 计数控制:

void CPoint21Dlg::OnTimer(UINT_PTR nIDEvent){
m_count++;
}

5> 停止计时器:

KillTimer (m_time);

(2) 多媒体高精度计时器的使用方法:

1> 包含相关头文件和库:

#include <mmsystem.h>	
#pragma comment(lib, "WINMM.LIB")

2> 设置并启用多媒体计时器:

int m_acc=0;//全局计数变量
static UINT m_nTimerID=0;//多媒体计数器编号

//自定义配置及启动多媒体计数器函数
void CPoint21Dlg::MultimediaTimer(){
TIMECAPS tc;
//获得定时器分辨率
if (timeGetDevCaps(&tc, sizeof(TIMECAPS)) != TIMERR_NOERROR){
return;
}

UINT nResolution = min(max(tc.wPeriodMin, 1), tc.wPeriodMax);

UINT nInterval = 1;
if (nInterval < nResolution){
nInterval = nResolution;
}

//设置定时最小分辨率
timeBeginPeriod(nResolution);
//设置定时器
m_nTimerID = timeSetEvent (4, nResolution, 
CPoint21Dlg::CallBackFuncTimer,(DWORD)this, TIME_PERIODIC);
}

3> 计数控制:

void CALLBACK CPoint21Dlg::CallBackFuncTimer(UINT wTimerID,UINT msg,DWORD dwUser,DWORD dw1,DWORD dw2){
m_acc++;
}

4> 停止多媒体计时器:

timeKillEvent (m_nTimerID);