VC++中的计时器及多媒体高精度计时器
最后更新于:2022-04-01 20:35:07
Windows计时器是一个非常有用的编程元素,而且计时器的使用非常简单,我们只需要一个时间间隔参数来调用SetTimer函数设置和启动计时器,通过WM_TIMER消息的响应函数进行计时器控制,调用KillTimer函数停止计时器。
但是由于Windows是一个非实时操作系统,所以如果我们定义的时间间隔小于100ms的时候,计时器可能不会很准确。所以,对于有些时间要求比较高的情况,我们需要使用多媒体高精度计时器来完成计时,它的精度可以达到1ms。
下面结合实例详细讲述计时器和多媒体高精度计时器使用方法(完整实例可在我的CSDN资源中下载:[http://download.csdn.net/detail/margin1988/8328525](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
#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);
~~~
';