如何降低线程的CPU100%占有率? 郁 闷 中... 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用一些Sleep 这类的函数,让线程能有停顿。 如果是由于循环造成的,sleep之类的函数在2000下应该可以。如果是由于某个操作,如查询数据库、硬件通讯等等造成的,估计是没有办法了。贴出源码来看看。 在大的循环中加入一句 sleep(0) 一定有用的 sleep(0):同样占用100%.sleep(1):速度狂降4倍,占用率:4%;sleep(2):降8倍,占用率2%......还是治标不治本.sleep方法不可取.to:cuihl(存在即是合理) 是一个半死的循环:while true do ...这样的.现是探讨,没有具体代码.以后肯定会碰到.我的一个朋友已在这上面吃了大亏了... sleep(50);或sleep(100)试试;我做的监控系统是那样,不过还是有小问题,在性能比较好的电脑上没问题,差的电脑就有慢的问题,正在完善中,各位有好的方法请贴出;或用QQ交流;101574896 我一般用sleep(10),我觉得效果还不错呢 sleep应不是合理解决问题的方法.肯定还有我们不知道的方法可以更好的解决.E文好的朋友可以看看DELPHI的HELP或官方站点 信不信由你,我认为正解仍然是sleep,当然,在主线程里面使用Application.processMessages;因为SLEEP函数精度大约50左右吧。。SLEEP(50)之内就足够了。 我认为是程序设计还有问题,临时解决办法只能用sleep,至于数多大自己看着办吧 SLEEP在不同系统中容易出莫名其妙的错误,详见<<DELPHI5开发人员指南>>.使用SLEEP一定会延时,否则无效.对于实时监控环境中,延迟是无法接受的.没有解了吗? windows 本身就不是实时的操作系统,他的线程更不可能做到实时了。 据说SLEEP是最好的解决方法,也必须如此,我也问过好多人! 我想知道SLEEP 到底怎么用 ,有人可以提供代码吗? sleep(0)。sleep并不是单纯的做个延时,他还会把当前线程剩余的CPU时间全部放弃,交给其他的线程去使用。 我试过了.SLEEP(0)无用.仍然100%CPU 与操作系统也有关。在NT内核的的系统下,sleep应该很管用。好像是NT对多任务的支持比98内核的好得多。 首先我们先理解一下Windows的多任务多线程:多线程的实现原理 创建一个进程时,它的第一个线程称为主线程(Primary thread),由系统自动生成。然后可以由这个主线程生成额外的线程,而这些线程,又可以生成更多的线程。 在运行一个多线程的程序时,从表面上看,这些线程似乎在同时运行。而实际情况并非如此,为了运行所有的这些线程,操作系统为每个独立线程安排一些CPU时间。单CPU操作系统以轮转方式向线程提供时间片(Quantum),每个线程在使用完时间片后交出控制,系统再将CPU时间片分配给下一个线程。操作系统给每个线程分配不同的CPU时间片,在某一个时刻,CPU只执行一个时间片内的线程,多个时间片中的相应线程在CPU内轮流执行,由于每个时间片时间很短,所以对用户来说,仿佛各个线程在计算机中是并行处理的。操作系统是根据线程的优先级来安排CPU的时间,优先级高的线程优先运行,优先级低的线程则继续等待。 忘了说我的环境是DELPHI7+Win2000 这与用哪个API有关,有些API要进行很多的运算,因此,CPU占用度就大了。 我的做法是减少sync函数对VCL资源的调用、用Sleep适当延迟但是对调用dll访问硬件设备遇上等待超时大量占用cpu资源好像没有办法。因此对于楼主的程序,即使使用了线程,还要看主程序是不是有死循环的情况,否则不应该100%占用cpu的情况的。 Sleep(0)是正确,用了一定有效的。在线程里执行Application.ProcessMessage不可取。 或者可以尝试一下 SwitchThread一般我用sleep是完全可以的 EndTime := GetTickCount() + 100while GetTickCount() < EndTime doApplication.processMessages; 如果是GUI程序,在主线程中不建议sleep,主线程中建议楼上的方法来暂停大约100毫秒。 tpIdle 最低的优先级。只有系统处于空闲状态时才执行tpLowest 比普通优先级低两级tpLower 比普通优先级低一级tpNormal 普通的优先级tpHigher 比普通优先级高一级tpHighest 比普通优先级高两级tpTimeCritical 最高的优先级 在(x,y)处已画了一图形,如何避免后面画的图不覆盖该图,可否设一此地方已被占领的标志? 关于com+的初级问题? 请教:TPageControl,属性页之间如何拖动? 提问,类似P2P软件连接方案 最火爆的影片《英雄》提供下载(不是灌水,提供资源,请版主不要删) grid中在左侧状态栏加入序号的方法,急,急 cobi (小新)请进 delphi不认access2000吗??为什么我打不开呢?? 请问如何将CHECKBOX中的对勾打印出来? SHS 窗口中自定义过程在哪声明 那位知道.dpg后缀名的文件用什么东东可以打开?
如果是由于某个操作,如查询数据库、硬件通讯等等造成的,估计是没有办法了。
贴出源码来看看。
sleep(0)
一定有用的
sleep(1):速度狂降4倍,占用率:4%;
sleep(2):降8倍,占用率2%......
还是治标不治本.
sleep方法不可取.to:cuihl(存在即是合理)
是一个半死的循环:
while true do ...这样的.
现是探讨,没有具体代码.以后肯定会碰到.
我的一个朋友已在这上面吃了大亏了...
我做的监控系统是那样,不过还是有小问题,
在性能比较好的电脑上没问题,差的电脑就有慢的问题,
正在完善中,各位有好的方法请贴出;
或用QQ交流;101574896
肯定还有我们不知道的方法可以更好的解决.
E文好的朋友可以看看DELPHI的HELP或官方站点
因为SLEEP函数精度大约50左右吧。。SLEEP(50)之内就足够了。
使用SLEEP一定会延时,否则无效.对于实时监控环境中,延迟是无法接受的.
没有解了吗?
仍然100%CPU
在NT内核的的系统下,sleep应该很管用。好像是NT对多任务的支持比98内核的好得多。
多线程的实现原理
创建一个进程时,它的第一个线程称为主线程(Primary thread),由系统自动生成。然后可以由这个主线程生成额外的线程,而这些线程,又可以生成更多的线程。
在运行一个多线程的程序时,从表面上看,这些线程似乎在同时运行。而实际情况并非如此,为了运行所有的这些线程,操作系统为每个独立线程安排一些CPU时间。单CPU操作系统以轮转方式向线程提供时间片(Quantum),每个线程在使用完时间片后交出控制,系统再将CPU时间片分配给下一个线程。操作系统给每个线程分配不同的CPU时间片,在某一个时刻,CPU只执行一个时间片内的线程,多个时间片中的相应线程在CPU内轮流执行,由于每个时间片时间很短,所以对用户来说,仿佛各个线程在计算机中是并行处理的。操作系统是根据线程的优先级来安排CPU的时间,优先级高的线程优先运行,优先级低的线程则继续等待。
但是对调用dll访问硬件设备遇上等待超时大量占用cpu资源好像没有办法。
因此对于楼主的程序,即使使用了线程,还要看主程序是不是有死循环的情况,否则不应该100%占用cpu的情况的。
在线程里执行Application.ProcessMessage不可取。
一般我用sleep是完全可以的
EndTime := GetTickCount() + 100while GetTickCount() < EndTime do
Application.processMessages;
tpLowest 比普通优先级低两级
tpLower 比普通优先级低一级
tpNormal 普通的优先级
tpHigher 比普通优先级高一级
tpHighest 比普通优先级高两级
tpTimeCritical 最高的优先级