线程一执行,CPU的占用特高,如何减少 ( 积分: 10 )

  • 主题发起人 主题发起人 qnmd
  • 开始时间 开始时间
Q

qnmd

Unregistered / Unconfirmed
GUEST, unregistred user!
线程一执行,CPU的占用特高,如何减少
 
线程一执行,CPU的占用特高,如何减少
 
sleep(10000)
 
[:D]
sleep 可以让系统释放内存呀?
先试试看
 
sleep(1)应该就可以了
 
设置Priority线程级为低级
 
sleep(1)应该就可以了
不过这样可能会很慢
 
一群白痴。。。
 
把你的代码贴出来吧,看看是怎么回事,帮你优化一下
 
Priority线程级为最低的,线程永远执行,作为一个监视线程.但是CPU占用很高.
 
是不是用了for循环
 
贴代码咯,检查有没有死循环
 
不要用循环去等待
 
在TThread单元中,有这个类的具体定义,在引用时需要给Terminate方法写代码,即为OnTerminate写代码。
 
unit UnitInfo;
interface
uses Classes,ComCtrls,ADODB,unitclass;
type
TSoftInfo = class(TThread)
private
Fxh:integer;
FhMutex:THandle;
Fitem:Tlistitem;
protected
procedure ShowInfo;
procedure Execute;
override;
public
FAddr:Pointer;
SqlList:TADOQuery;
FFields:integer;
FView:TListView;
constructor create;
end;

implementation
uses forms,Windows,SysUtils;
{ TSoftInfo }
constructor TSoftInfo.create;
begin
Fxh:=1;
FhMutex:=CreateMutex(nil,false,nil);
SqlList:=TADOQuery.Create(nil);
freeonterminate:=false;
inherited create(true);
end;

procedure TSoftInfo.Execute;
begin
if WaitForSingleObject(FhMutex,INFINITE)=WAIT_OBJECT_0 then
try
SqlList.Open;
while (not SqlList.Eof) and (not terminated) and (not application.Terminated)do
begin
ShowInfo;
inc(Fxh);
SqlList.Next;
end;
finally
SqlList.Close;
freeandnil(SqlList);
Pointer(FAddr^):=nil;
FAddr:=nil;
ReleaseMutex(FhMutex);
CloseHandle(FhMutex);
end;
end;

procedure TSoftInfo.ShowInfo;
var i:integer;
Dbid:SelfId;
begin
Fitem:=Fview.Items.Add;
new(Dbid);
Dbid.id:=SqlList.FieldByName('id').AsInteger;
Dbid.sl:=0;
Fitem.ImageIndex:=SqlList.FieldByName('xb').AsInteger;
Fitem.Data:=Dbid;
Fitem.Caption:=inttostr(Fxh);
for i:=1 to FFieldsdo
fitem.SubItems.Add(SqlList.Fields.AsString);
end;

end.
 
dll中线程代码,请大家改进了.
 
SqlList.Open;
//打开数据库本身就很占用CPU
while (not SqlList.Eof) and (not terminated) and (not application.Terminated)do
begin
ShowInfo;
//没有保护!
inc(Fxh);
SqlList.Next;
end;

另外在while循环里还执行for循环,如果数量很大的话,必然占用很多CPU
 
如果数据内的信息量是固定的(这样这段代码应该有固定的结束周期)
我觉得没必要也不应该多用一个线程去弄
何况这个线程内还用VCL代码
如果仅是为了在读取数据库时界面还可以响应
那应该在while循环内用Application.ProcessMessages;
一个线程即可
另一方面,如果数据库信息量是在随时增加的(按代码好像不大可能)
那么这个线程代码除VCL和数据库读取部分须改进之外
还是应该在while循环内Sleep一下
不然线程没有间歇时间,CPU占用率当然不会低下来
 
用事件啊,CreateEvent
 
后退
顶部