zoukankan      html  css  js  c++  java
  • 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()及相关的函数是可以正常使用的。又是一个没有在帮助中说明的函数!
    使用多媒体定时器,最终实现了秒表的功能。 
  • 相关阅读:
    Python面试题汇总
    异常处理及反射
    DOM
    socket
    python生成器、迭代器、列表 字典 集合解析、迭代器表达式
    C++繁琐的类型转换,C++小知识之四种类型转换
    C++命名空间
    C++合并exe文件,将两个合并成一个
    BERT 之后,Transformer 还会出现高光时刻吗
    App开发常见布局,流式布局讲解
  • 原文地址:https://www.cnblogs.com/91program/p/5255614.html
Copyright © 2011-2022 走看看