vc高精度多媒体定时器的使用方法

在VC编程中,用SetTimer可以定义一个定时器,到时间了,就响应OnTimer消息,但这种定时器精度太低了。如果需要精度更高一些的定时器(精确到1ms),可以使用下面的高精度多媒体定时器进行代码优化,可以达到毫秒级的精度,而且使用方便。先要包含头文件"mmsystem.h"和库文件"winmm.lib"。

vc高精度多媒体定时器的使用方法如下:


#include "mmsystem.h"  //head file

#pragma comment(lib,"winmm")  //lib file

const    int        timePeriod = 2;
const    int        timeRes = 1 ;

/*******************MMTimer fuction********************************\
   CreateTimer :   create a Multimedia timer
   DestroyTimer:   destroy a Multimedia timer
   TimerHandler:   the actual timer handler procedure
\******************************************************************/

/******************************************************************\
  function
    name : CreateTimer
    desc : create a realtime timer
  argument
    void
  ret code
    [HANDLE] ,the handle of the timer
\******************************************************************/
UINT CMyTimer::CreateTimer()
{
    //create the timer
    
    // Create a periodic timer
    timeBeginPeriod(timeRes);
    timerID = timeSetEvent(
        timePeriod,
        timeRes,
        TimerHandler,
        (DWORD)this,
        TIME_PERIODIC);
    
    return timerID;
}

/******************************************************************\
  function
    name : DestroyTimer
    desc : destroy the timer created by calling CreateTimer
  argument
    void
  ret code
    void
\******************************************************************/
void CMyTimer::DestroyTimer()
{

    if ( bRun )
    {
        timeKillEvent(timerID);
        timeEndPeriod(timeRes);

        bRun = FALSE;
    }


}

/******************************************************************\
  function
    name : TimerHandler
    desc : timer procedure called when the the timer signaled
  argument
    dwUser,[in],user para data
  ret code
    void
\******************************************************************/

void CALLBACK CMyTimer::TimerHandler(UINT id, UINT msg, DWORD dwUser, DWORD dw1, DWORD dw2)
{
    CMyTimer* pThis = (CMyTimer*)dwUser;

}



使用多媒体定时器timeSetEvent()函数,该函数定时精度为ms级。利用该函数可以实现周期性的函数调用。函数的原型如下:
       MMRESULT timeSetEvent( UINT uDelay,
                               UINT uResolution,
                               LPTIMECALLBACK lpTimeProc,
                               WORD dwUser,
                               UINT fuEvent )

  该函数设置一个定时回调事件,此事件可以是一个一次性事件或周期性事件。事件一旦被激活,便调用指定的回调函数, 成功后返回事件的标识符代码,否则返回NULL。函数的参数说明如下:

       uDelay:以毫秒指定事件的周期。
       Uresolution:以毫秒指定延时的精度,数值越小定时器事件分辨率越高。缺省值为1ms。
       LpTimeProc:指向一个回调函数。
       DwUser:存放用户提供的回调数据。
       FuEvent:指定定时器事件类型:
       TIME_ONESHOT:uDelay毫秒后只产生一次事件
       TIME_PERIODIC :每隔uDelay毫秒周期性地产生事件。

文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: 优化 定时器
相关日志:
评论: 2 | 引用: 0 | 查看次数: -
回复回复流氓灰灰[2011-03-29 03:15 PM | del]
你好,为什么在
timeSetEvent(
        timePeriod,
        timeRes,
        TimerHandler,
        (DWORD)this,
        TIME_PERIODIC);
中,会提示TimerHandler与形参类型不符,把TimerHandler改成全局函数之后就不提示,但是又无法用CMyTimer类的函数及变量。
回复来自 admin 的评论 admin 于 2011-04-26 03:22 PM 回复
TimerHandler要定义成static函数。
CMyTimer类的函数及变量可以通过pThis指针访问。
回复回复神奇[2010-05-18 10:14 PM | del]
怎样在另一个类中使用这些函数?在另一个类里面怎样向CMyTimer::TimerHandler()添加定时器要执行的语句?
回复来自 admin 的评论 admin 于 2010-05-19 01:15 PM 回复
在CMyTimer初始化时获取另一个类的指针,在TimerHandler中通过指针调用要执行的函数即可。
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.