高精确度且线程分离的定时器——多媒体定时器

说道定时器,很多人都会想到Windows定时器SetTimer吧!其实,项目里面原本确实是使用这种方法实现动画效果的,但是后来问题出现了!由于WM_TIMER消息优先级比较低,常常被丢失,导致一个WM_MOUSEMOVE消息都会影响整个动画的效果。

  这时我就考虑,是否能给定时器创建一个单独的线程,接着就发现了“多媒体定时器”这个东西。它是一个高精确度定时器,一般的Windows定时器只能精确到55ms,而多媒体定时器能精确到10ms内。同时,在启动一个多媒体定时器的同时,会自动创建一个线程,专门负责定时器控制。不仅如此,多媒体计时器具有较高的优先级(记得是15),因此能够满足实时控制的需求。但是这也为它带来了不利的因素,同时对于定时器响应函数的内容也有一些限制,具体情况有时间再详细说明下!

为了学会使用它,我研究了很多相关资料,其中经典的算《C++builder 深度历险》这本书了。嘿嘿~ 闲暇的时间看了下C++builder,又收获了一些其它知识。

  首先,简要介绍下几个重要的函数,具体说明见MSDN!

 1)MMRESULT timeGetDevCaps( LPTIMECAPS ptc, UINT cbtc );

   功能:获得计时器所支持的解析度范围。

 2)MMRESULT timeBeginPeriod( UINT uPeriod );

   功能:调整计时器的解析度,用在启动计时器之前。

 3)MMRESULT timeEndPeriod( UINT uPeriod );

  功能:调整计时器的解析度,用在结束计时器之后。这两个函数通常是成对出现。

 4)MMRESULT timeSetEvent( UINT uDelay, UINT uResolution, LPTIMECALLBACK lpTimeProc, DWORD_PTR dwUser, UINT fuEvent );

  功能:设置并启动一个计时器

 5)MMRESULT timeKillEvent( UINT uTimerID );

  功能:取消一个定时器

  好了!废话不多少,直接跳到使用方法阶段:

  1)设置并启动定时器

1   if (timeBeginPeriod(5) == TIMERR_NOERROR )
2   {
3       m_uTimerID = timeSetEvent(30,5,TimeProc,(DWORD)GetSafeHwnd(),TIME_PERIODIC);
4   }

  2)取消定时器

1 timeKillEvent(m_uTimerID);
2 timeEndPeriod(5);

  3)定时器处理函数

1 void _stdcall TimeProc(UINT uTimerID,UINT uMessage,DWORD dwUser,DWORD dw1,DWORD dw2)
2 {
3     ::SendMessage((HWND)dwUser,UM_TIMER_PROC,0,0);
4 }

 Tip:  定时器处理函数一般定义为全局函数,而函数内部使用的方法也只能是全局变量或函数!

   最后,不要忘记加上以下头文件和动态链接库:

1 #pragma comment(lib,"Winmm.lib")
2
3 #include <Mmsystem.h>

 

时间: 2024-09-20 05:45:57

高精确度且线程分离的定时器——多媒体定时器的相关文章

多媒体定时器和跨线程更新窗口学习总结

总结了一些关于多媒体定时器的使用和处理跨线程更新窗口的原理和方法 微软在32位版本的系统里提供了一组所谓的"多媒体定时器"API,多媒体定时器可以使应用程序最大限度的获得硬件平台支持的定时精度.可以实现高精度的定时,例如可以应用于 MIDI序列发生器,MIDI时间产生的精度在一毫秒之内. 一.多媒体定时器的使用方法设置多媒体定时器timeSetEvent()函数,定时精度为ms级.利用该函数可以实现周期性的函数调用.1.函数的原型如下: MMRESULT timeSetEvent( U

一个使用多媒体定时器的简单例子

1)新建一个工程,保存 2)添加一个Button和一个Label 3)修改unit1.h代码如下: // --------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H // --------------------------------------------------------------------------- #include <Cl

python使用线程封装的一个简单定时器类实例

  本文实例讲述了python使用线程封装的一个简单定时器类.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 from threading import Timer class MyTimer: def __init__(self): self._timer= None self._tm = None self._fn = N

Linux 线程分离状态

线程的分离与结合      在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached).一个可结合的线程能够被其他线程收回其资源和杀死:在被其他线程回收之前,它的存储器资源(如栈)是不释放的.相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放. 线程的分离状态决定一个线程以什么样的方式来终止自己.在上面的例子中,我们采用了线程的默认属性,即为非分离状态(即可结合的,joinable,需要回收),这种情况下,原有的线程等待创建的线

查看Linux进程CPU过高具体的线程堆栈(不中断程序)

1.TOP命令,找到占用CPU最高的进程 $ top  top - 20:11:45 up 850 days,  1:18,  3 users,  load average: 1.04, 1.01, 0.99 Tasks:  61 total,   1 running,  60 sleeping,   0 stopped,   0 zombie Cpu(s):  1.4% us,  0.1% sy,  0.0% ni, 98.3% id,  0.1% wa,  0.0% hi,  0.2% si

怎么把主线程跟附加线程分离?

问题描述 RT,我在遍历的时候重新启动了一个线程,现在我要对这个线程进行暂停和继续的操作.但是这个线程跟主程序线程是绑在一起的,我一暂停整个程序都挂起来了.有什么办法能把那个新线程分离出来,暂停的时候不影响主程序??? 解决方案 解决方案二:开新线程就行了解决方案三:开始遍历的时候我是开启了一个新线程,在程序里判断的时候Thread.CurrentThread还是当前线程解决方案四:没有解决办法吗?解决方案五:你把遍历这个任务给你新线程,然后你想遍历就通知子线程遍历,这样主线程停了也没关系了解决

新型全光学原子钟高精确度 每3亿年误差竟为1秒

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;      [ 科技讯]5月21日消息,据媒体报道,国际度量衡委员会一直以铯原子钟作为精确的标准计时工具,近期,一种新型的基于激光技术的全光学原子钟出现,其精确度能达到每3亿年误差一秒,是铯原子钟的3倍. 全光学原子钟是依靠一种锶原子激光束使其振荡计时,激光束的振动比微波辐射快很多,在某种程度上来说我们把时间分成了更小的时间间隔,这样我们可以更加精确地衡量时间.更为重

php BC高精确度函数库

$right 返回 1 *$scale 小数点位数 *************************************************************************************** $a = 4.45; $b = 5.54; if(bccomp($a, $b, 2) == 0) { } ***********************************************************************************

stm32 定时器-STM32定时器1控制电机输出两路PWM波形问题

问题描述 STM32定时器1控制电机输出两路PWM波形问题 本人刚学stm32,用定时器1的CH1和CH2输出pwm波形是不知道为什么没有高电平输出,电机根本不转求大家看看 #include "include.h" /* 硬件连接: (PE9->EN1---TIME1_CH1 右) (PE11->EN2---TIME1_CH2 左) PA4->INT4 PA5->INT3 PA6->INT2 PA7->INT1 */ /*0011 1010---&g