大家都知道windows自己的定时器精度差得惊人吧?而其他的高阶定时器用起来太麻烦,怎么办呢?
如果定成10ms精度,出来多半是20ms的;定成50ms精度,出来多是60毫秒……虽说在不同电脑上运行略有差别,但这个误差基本是确定的,虽有变化,但是变化不大。我想出了个办法,可以自适应调整出最精确的时间间隔。举例而言,你希望得到尽量精确的40ms时间间隔,比如用于25帧每秒的时间信号,但是又自知调SetTimer调节成40ms的话,出来估计就成了20帧每秒了……我想出了个办法,先申请一号定时器,间隔为一秒,这个精度还是可以的,做为参考定时器;随后申请40ms的二号定时器,然后以一号定时器为基准,记录在这一秒内二号定时器tick了多少次,比如测量出实际tick了20次,于是求得了实际计时周期是50毫秒,和我们期望的40毫秒相差10毫秒,于是调用程序,把第二个定时器的周期减去10毫秒,即重新设定为30毫秒。这样的设定很可能出来的周期还是略有瑕疵,比如实际周期只有38毫秒了,被第一个定时器探测到,相差负二毫秒,所以再给他加上2毫秒……就这样两个定时器同时运行,不停地测量修正,最终得到非常精确的40毫秒周期信号!呵呵,小弟我是学电气自动化的,因为学了不少自动控制理论,所以在这里建立了一个“闭环自动控制系统”,由于windows消息队列可能一直在变,系统负荷在变,导致定时器精度变化,但是有了这样一个闭环输入输出系统,用行话说,那抗扰动性能真是强的不得了啊!小弟不谦虚了,还请大家多多包涵!

解决方案 »

  1.   

    SetTimer这东东在MSDN上就有说明,MS自己都说不精确了,你为什么还要强求呢!
    看了你的“闭环自动控制系统”,其实是不稳定的,如果CPU负荷太重,窗口是收不到WM_TIMER消息的或者延迟响应。
      

  2.   

    有意义?的基准1秒就是1秒? 自己不都说有误差了嘛 基准都不准后面的还说什么?
    何况为了你这20MS要那么复杂的测,经过N次测,得到的最多是系统的误差大概是多少。
    但定时器消息级别很低的,系统忙起来你怎么弄都会不准!!!