EVC编程点滴-WM_TIMER冲突处理与精度

关于WM_TIMER有两点将会在此文章中说明:
(1)  WM_TIMER响应冲突
(2)  时间的精确性
(1) WM_TIMER响应冲突:即多个WM_TIMER同时到达时的处理
首先,WM_TIMER这个消息的优先级很低,类似的还有WM_PAINT消息。只有在消息队列里面没有其他消息的时候,才会执行这两个消息。
以下是EVC4帮助中的原话:The WM_TIMER message is a low-priority message. The GetMessage and PeekMessage functions retrieve this message only when no other higher-priority messages are in the thread’s message queue.
这段时间,在CSDN的 硬件/嵌入开发>嵌入开发(WinCE)中,就在讨论TIMER这个消息,具体的内容见:
http://topic.csdn.net/u/20071205/10/f97d8fed-3ea9-4a7f-a2e0-3b707f4ca264.html
网上有这样一段话(不是权威):
[多个WM_TIMER同时到达时,WM_TIMER是会产生的,不过如果多个相同WM_TIMER排在一起,会被合并。]这个说法,符合上面帖子中实际测试得到的结果。
但是另一段话是这样的:
[消息队列里面不会载入多个WM_TIMER。WINDOWS会将消息队列只保留一个WM_TIMER,舍弃其他的WM_TIMER。] 但是没有说,对WM_TIMER消息是如何处理的!
所以,根据帖子中实测的结果与上述文字可以得到以下结论:消息队列里面不会载入多个WM_TIMER;如果多个相同WM_TIMER排在一起,会被合并执行最后一个WM_TIMER对应的功能。
***欢迎大家来讨论此问题,上述结论不一定正确噢!
(2) WM_TIMER在时间上的精确性
对WM_TIMER精度的研究,源于秒表功能的实现。
刚开始采用WM_TIMER做为秒表的驱动源,测试发现秒表走一段时间后,就不准了。
当然这一段时间,根据MW_TIMER的越时时间不同而不同。超时时间段越小,这段时间越短;超时时间越长,这段时间也越长。但是即使使用1秒的间隔,也是不行的。
[WM_TIMER精度大约为55ms,用来做简单的动画效果倒够用,但稍微高一点要求的就难了。]
WM_TIMER单次的精度,一般大家在使用的时候,不太注意,时间差不多就可以了。但多次WM_TIMER的累积后,精确度不准是很明显的。
最后无奈的放弃了使用SetTimer()的想法。
在网上查找,发现VC下有多媒体定时器,是一个精度比较高的定时器。例如其函数timeSetEvent(),可是在EVC4的帮助文件中,竟然没有找到它的帮助。直接晕倒......
但是经测试发现,EVC中timeSetEvent()及相关的函数是可以正常使用的。又是一个没有在帮助中说明的函数!
使用多媒体定时器,最终实现了秒表的功能。 

 

posted @ 2016-03-08 21:02  91program  阅读(464)  评论(0编辑  收藏  举报