解决cpu占用率过高的问题

以下是从百度知道转回来的:

什么代码都没用,CPU占用是windows在分配,与delphi无关,application.processmessage只是处理其他事件而已,cpu同样会占用很高。
无论是用线程还是什么,只要你的cpu闲置,windows就会考虑尽快用更多的cpu将你的指令执行完毕。
唯一的方法是调低自己的程序优先级,将自己降低,但是这也不保证就不占用cpu时间。
所以你不能考虑cpu占用,只需要考虑你的程序在执行大量代码的时候不会阻塞运行就行了。cpu占用你没法调整。
另外,楼上说的强制将代码循环停滞也是一种方法,不过这个就慢了,本来1秒钟可以计算出来的要分成几十秒钟来算了。

 

以下是从盒子论坛转载过来的:

线程轮询串口数据, cpu占用率过高(60-99), 但我在每次查询串口操作后都用了sleep, 从1000, 到10000ms, 变化都不大. 于是想到可能是查询串口的函数本身的问题, 于是trace进入,发现

  repeat
    //sleep(10);
  until (GetTickCount-TickTime>=5000) or (aCPort.InputCount=5);

原来是没有sleep(10)的, 所以等待数据的5秒钟内,都没有休息, 加上10ms的休息后,效果就很好
后来进一步降低到2ms, 效果也很好( cpu占用率从60以上 降到 0-2)

如果把sleep换成application.ProcessMessages; 则作用不大, 原因还等待研究

得出的一个启示:
用于降低cpu占用率的sleep语句中休眠的时长不需要很大,通常在循环中每次Sleep(2)足够了
问题处在处理过于集中。在Sleep()之前执行了大量的分析操作,所以Sleep没有起到该有的作用

改进方式,将工作量均衡。不要在忙的时候不停,在清闲的时候不动弹
比如一趟处理过程, 原来在最后完成时sleep(100), 改为分散在过程中多处sleep(10)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值