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()及相关的函数是可以正常使用的。又是一个没有在帮助中说明的函数! 使用多媒体定时器,最终实现了秒表的功能。