一、简介
在工业生产控制系统中,有许多需要定时完成的操作,如数据采集程序。Win32提供了一个基于消息机制的定时器,使用SetTimer函数创建一个内存对象,设定间隔时间,当到达要求的间隔时,计时器对象发送一个WM_TIMER消息,由相应函数处理。但是由于WM_TIMER优先级低,只有等待消息队列中的其他消息都处理完毕后系统才会响应该消息。而且消息队列中的多个WM_TIMER会被合并,因此Win32定时器的精度低,不能满足工业实时控制系统的要求。
本文将介绍一种精度较高的多媒体定时器,该定时器并不依赖于消息机制,可以实现1ms的定时精度。由于多媒体定时器另外开辟一个独立线程执行定时器回调函数,因此当回调函数耗时较多时并不会导致UI的“假死”,相对而言,Win32定时器隶属于主线程,一旦定时器回调函数耗时较多,就会导致UI的“假死”。
多媒体定时器相关API如下:
MMRESULTtimeGetDevCaps(
LPTIMECAPSptc,
UINTcbtc
);
函数功能:获取定时器设备能力
参数:ptc指向一个TIMECAPS型的结构,TIMECAPS有两个成员,wPeriodMin和WperiodMax,表示定时器设备支持的最小时间周期和最大时间周期;cbtc表示TIMECAPS结构的大小
MMRESULTtimeBeginPeriod(
UINTuPeriod
);
函数功能:设置定时器设备的最小时间分辨率
参数:最小时间分辨率,以毫秒为单位
MMRESULTtimeEndPeriod(
UINTuPeriod
);
函数功能:清除之前对定时器设备的设置
参数:timeBeginPeriod中指定的最小分辨率