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); ~~~
';