为什么我的线程起来会占用99%的CPU时间?(80分)

  • 主题发起人 主题发起人 labafa
  • 开始时间 开始时间
线程?都给微软骗了,线程就是死循环(个人意见);
加sleep吧。
 
to tinytao
//使劲握手 ,同志你真是太了解了,俺同意你, hehe
 
高手们:我想实现这样一个东东:
form1:
procedure form1.connectdatabase;
begin
//form2.show;
//在form2显示时创建线程,
//也就是form1不能死要活的,
//而form2中的socketconnect在联接数据服务器。
if form2.connected
then
...
end;
能做到吗?
我写的程序中form1总是死的当然form2是活的。
 
支持huanGe用WaitForSingleObject,用ProcessMessages也可以;
用Sleep要小心:在线程内部用来做空闲等待(相当于降低线程灵敏度)是可以的,
用来等待信号状态则可能死锁,看你怎么用。
线程起来会占用99%的CPU时间:要看你的线程的优先级和任务是否繁忙。你一直让
线程做运算,又没有其它线程跟它抢时间,所以会用掉全部CPU。
真是的,我怎么好像是在重复别人说的话呢?
 
怎么大家对Sleep都没什么好感?
WaitForSingleObject主要是用来防止线程间公用资源的访问冲突的,和CPU占用率
有关系吗?
ProcessMessages更是不着边际了,你看看下面的语句CPU会占到多少:
While truedo
Application.ProcessMessage;
 
看了楼上高手们的阔论,还是不明白该怎么办!
 
再说两句,像下面的线程,还能叫多线程吗?
while not terminateddo
begin
WaitForSingleObject(hVar, INFINITE);
end
 
我赞同楼上楼上老兄所说。
Sleep一样可以减少对CPU的占用。
 
我一直用sleep,不知还有什么更好的方法?
 
做过一个实验:
开100个线程,执行一下代码:
procedure mythread.Execute;
var i:integer;
begin
i:=0;
while truedo
begin
i:=i+1;
sleep(10);
if i>1000 then
break;
end;
end;

发觉如果改为sleep(3)的话,会占用更多的CPU,这是不是说,
sleep本身不怎么占用资源,而是他的频繁切换占用了大量的资源呢?
 
我想不是这样吧,sleep(3)才等待3毫秒,其他时间都是不断的进行计算,
当然很占用CPU了。
 
各位错了吧?我向来在线程里面作等待和循环,当然这样的线程不能太多
也就消耗30-40%的CPU时间呀,象sleep,我绝对不会用的,太浪费了
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
835
SUNSTONE的Delphi笔记
S
S
回复
0
查看
765
SUNSTONE的Delphi笔记
S
后退
顶部