timer的interval设的是10,CPU占用率高达50%。其实循环量也没多少,数都能数出来。而且改变interval似乎也没有降低占用率。但是去掉循环,占用率就回到1%。不知是何缘故

解决方案 »

  1.   

    循环中加入一个sleep(1)
    释放一下CPU的轮询
      

  2.   

    不建议在 timer 里面循环,因为 timer 本来就占CPU时间片,加上循环就可想而知了。
    非得已的话,用线程来实现循环,然后等待这个线程完成后,获得需要的数据才继续。
      

  3.   

    无语,年轻人做事不要急Timer本身就是循环性质的,里面再加循环,嗨……跟你说一下吧Timer它不会管它里面的程序是否结束,一但到循环时间,它又会启动新一轮它里面的程序,那你说短短1秒内,这个主程序运行了多少Timer啊???http://www.cnblogs.com/del/category/174761.html去学习一下吧,也许对你有用
      

  4.   

    Timer它不会管它里面的程序是否结束,一但到循环时间,它又会启动新一轮它里面的程序
    ----------------------------------------------------------------------------你自己有没做过实验的?
      

  5.   

    我做的程序需要每秒刷新60次页面,不用timer怎么做?
      

  6.   

    如果Timer里的循环占用的Cpu很严重, 那么每10毫秒就要执行一次, 这样你的程序就会高负荷占用Cpu, 其实不一定说你的程序没过10毫秒就会去执行你的循环, 而是这么一个机制, 你的程序每过10毫秒就会接到windows的通知从而执行你的循环代码, 假如你循环的代码执行时间超过10毫秒,那么下次windows发的通知会停留在队列里, 等待你循环后再去接收这个消息从而再次触发这个循环, 但是这里有另外一个机制, windows的Timer消息是不会重复叠加的, 也就是说假如消息队列里存在了这个通知, 那么下一个通知是不会被放到队列里的, 你可想而知如果你的循环时间占用时间很长,那实际上这里就会隐性的变成一个大循环, 更像是一个"死循环".
      

  7.   

    timer里加循环是可以的。你的情况很可能是循环还没有完成,timer又启动了下一个循环,时间一长,同时运行的循环越来越多。就。。
      

  8.   

    队列太多,重复循环,CPU太累了。
      

  9.   


    本来就是吧,以上楼主讲得没错啊,
    Timer它不会管它里面的程序是否结束,一但到循环时间,它又会启动新一轮它里面的程序不信你自己去试验一下看看。
      

  10.   

    Timer执行是靠Timer消息,如果别的事件没执行完,消息循环就无法执行,就不会处理消息,自然也不会执行OnTimer里的内容。
      

  11.   

    Timer是执行完一次后,才继续等待Interval的,不然就不会那么多人问,为什么我用Timer无法精确定时采集图片数据了。Timer和线程是有区别的。
      

  12.   

    注意时钟控件的间隔时间单位是1000MS=1S,另外在事件里面加入延时
      

  13.   

    具体点,保证Timer的Interval比你在OnTimer里执行的时间更长,如:Interval>=5倍的OnTimer执行时间,这样用Timer肯定没问题。OnTimer执行时间不确定,还是不用Timer为妙。
      

  14.   

    你这么说就错了,从VCL源代码里我们得知,TTimer在SetTimer之后只有修改Interval之类情况才会UpdateTimer,执行OnTimer时只是响应消息而已。
      

  15.   

    我现在比较有疑问的也是SetTimer这里,不知道API里面是否是用线程来定时产生消息的?按道理来说,OnTimer还在执行的时候,是会堵塞应用程序的。这样的话OnTimer还没执行完,下一次的消息产生,应该也不能进行才对。但是不能准确定时执行OnTimer这个是肯定的(消息可能是准时收到了)
      

  16.   

    消息这个东西就说不定了,确实Timer是精度很低的。
      

  17.   

    我说的不能准确定时执行倒不是说它精度问题,主要是指前一次OnTimer执行时间长的话,后一次OnTimer就不能在预计的时间点上发生(被堵塞),得等到前一次执行完后才会执行。但是后一次的WM_TIMER消息可能是准时产生了。
      

  18.   

    有介绍说windows如果比较忙,就会不发消息。