高精度多媒体定时器(高级定时器和通用定时器频率区别)

1.背景

在项目上使用MFC的OnTimer(UINT_PTR nIDEvent)定时器时,发现他的响应级别低,精度不高,满足不了ms级别的定时,其后发现有一个多媒体定时器,它使用线程来进行定时,响应级别高,速度快,基本能满足3-4ms的定时需求。

2.多媒体定时器使用流程

高精度ms级定时器:多媒体定时器

3.多媒体定时器的使用

3.1 包含头文件

#include
#pragma comment(lib,”Winmm.lib”)

3.2 创建定时线程和定时时间

timeBeginPeriod(3);
int timeID2 = timeSetEvent(time, 1, (LPTIMECALLBACK)Timecallback, 1, TIME_ONESHOT);

函数原型:

MMRESULT timeSetEvent( UINT uDelay, UINT uResolution, LPTIMECALLBACK lpTimeProc, WORD dwUser, UINT fuEvent )

参数说明:

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

3.3 销毁定时器

定时结束后,会调用指定的回调函数,在该函数中执行需要的操作

static void CALLBACK Timecallback(UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2)
{
CshiguanjiemianDlg* fatherDlg = (CshiguanjiemianDlg*)::theApp.GetMainWnd();
if (dwUser == 1)
{
timeKillEvent(fatherDlg->timeID2);
timeEndPeriod(3);
}
return;
}

函数原型

void CALLBACK TimeProc( UINT uID, UINT uMsg,DWORD dwUser,DWORD dw1,DWORD dw2);

  • uID:时间事件标识符,当定时器被建立时,timerSetEcent函数返回该标识符。
  • uMsg:保留,未使用。
  • dwUser:由timeSetEvent函数的dwUser参数提供的用户实例数据。
  • dw1 and dw2 :保留字,未使用。

调用该回调函数后,在TIME_ONESHOT的情况下首先要对调用timeKillEvent(fatherDlg->timeID2)函数销毁指定ID的定时事件,然后调用timeEndPeriod(3),销毁指定的线程;

简单例程:***/download/qq_44733143/77859098?spm=1001.2014.3001.5503

原创文章,作者:芒小种,如若转载,请注明出处:http://www.fhgg.net/shenghuobaike/7659.html

本文来自投稿,不代表【食趣网】立场,如若转载,请注明出处:http://www.fhgg.net/

(0)
上一篇 2023年1月7日 下午4:26
下一篇 2023年1月7日 下午4:29

相关推荐

发表回复

登录后才能评论