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

1.背景

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

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

高精度ms级定时器:多媒体定时器_第1张图片

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),销毁指定的线程;

简单例程:https://download.csdn.net/download/qq_44733143/77859098?spm=1001.2014.3001.5503
        

你可能感兴趣的:(MFC基础,c++,mfc,windows,10)