我有一个采集任务 需要每隔1秒钟采集一次 用settimer 但是发现有的时候在1秒钟内该任务做了两次 有的时候1秒钟内该任务没有做,我想这个应该是由于windows系统时钟不精确的缘故,有什么好的解决办法么?

解决方案 »

  1.   

    不可能吧,settimer你设置定时器为一秒,在OnTimer()中执行你要的操作,和windows系统时钟不精确应该没有关系的
      

  2.   

    OnTimer()中执行你要的操作的时间长短直接导致你的TIMER不准确。
    因为timer消息是会等待的,如果你的间隔时间是1秒,你在OnTimer()中执行你要的操作的时间大于1秒,那下一个TIMER消息就会在消息队列里等你执行完操作后再到来,这个TIMER的间隔就大于1秒了。而再下一个TIMER如果也在消息队列里等待,则这个TIMER的执行完后下一个就会立刻执行,所以下个时间就等于执行时间,有可能不足一秒。如果第一个TIMER的执行时间占了2秒以上的话,如果每次OnTimer()中执行你要的操作的时间都比TIMER的间隔短的话,就不会出现上面的现象。
    另外TIMER的最小精度是10到100毫秒之间。
      

  3.   

    完全有可能一秒做2次。比如Timer的误差为50ms(~18.2次/秒),就可能在25ms做一次,到975ms又做一次。
      

  4.   

    按照windouws自己来检测的话,那是不是按照系统自己的时间确实是每秒一次没有问题呢?
    如果检测机制也是在同样的环境下运行的话,还是发现不了问题啊……
      

  5.   

    建议timer设置成100ms然后程序判断“每秒1次”
      

  6.   

    由于timer优先级较低,很有可能已接收到Timer消息后,由于给其他进程抢先执行,影响每次执行间隔。解决办法请参照游戏设计的方法编写,很多游戏设计教程都有。
      

  7.   

    同意8楼,我想的暂时解决办法也是如此
    其实设成50ms或20ms判断一次也行,判断的部分精简一点,并不占用很多资源的
    获取系统时间进行秒级别的判别就行了,新的一秒来了就记录
      

  8.   

    SetTimer 是同步的,要准确就开个线程,专门计时~~~
      

  9.   


    这位兄台所言差矣。windows中settimer时间精度是15.625ms(1/64秒)。time间隔设为1000ms的话不会应为这个精度影响计时效果。
    间隔990ms倒有可能(实际是)984.375ms
      

  10.   

    不可能吧,settimer你设置定时器为一秒,在OnTimer()中执行你要的操作,和windows系统时钟不精确应该没有关系的
      

  11.   

    试试直接在消息循环里用GetTickCount判断过了多少时间,然后每过1秒就做一次任务。
      

  12.   

    由于timer优先级较低,很有可能已接收到Timer消息后,由于给其他进程抢先执行,影响每次执行间隔。解决办法请参照游戏设计的方法编写,很多游戏设计教程都有。