使用线程后,CPU占用率96%,无助中......(附源码)(150分)

  • 主题发起人 主题发起人 大愚
  • 开始时间 开始时间

大愚

Unregistered / Unconfirmed
GUEST, unregistred user!
线程代码如下:
procedure TSendHandleThread.Execute;
begin
while not Terminateddo
begin
if not form1.Client.Connected then
Terminate
else
try
for con :=0 to DataQueue.Count-1do
begin
Synchronize(HandleInput);
// 通过IdTCPClient发送数据
DataQueue.Delete(0);
end;
except
end;
end;
end;

我想罪魁祸首就是"while not Terminateddo
"了,但我还是希望循环判断的功能,请高手指点.
 
procedure TSendHandleThread.Execute;
begin
[red]while not Terminateddo
[/red] =>(try to modify) TSendHandle.OnTerminated:=True;
begin
if not form1.Client.Connected then
Terminate
else
try
for con :=0 to DataQueue.Count-1do
begin
Synchronize(HandleInput);
// 通过IdTCPClient发送数据
DataQueue.Delete(0);
end;
except
end;
end;
end;

 
我看不出你的代码有什么问题。
启动线程后记得加上这句,设置好悠先级:
YourSendHandleThread.Priority:=tpIdle;
我的线程结构好像和你的也差不多,写过n多个了还没有出现过你那么严重的现象。
procedure TReadCardThread.Execute;
begin
while Not Terminateddo
begin
hasCard:=False;
if Readcard(CardContext,errmsg) then
begin
hasCard:=True;
Synchronize(UPDATECONTEXT);
end;
end;
end;
 
哦,对了,我的线程只有在需要的时候才运行Synchronize这种耗费系统资源的事情。
而你的线程不断的不管是不是需要Synchronize都进行窗体内容同步,所以肯定会耗费Cpu99%了。
 
你的线程没有什么问题,可能是Synchronize(HandleInput);
的问题。
你查查吧!
 
改成这样吧,比较好:
procedure TSendHandleThread.Execute;
begin
while (not Terminated) and (form1.Client.Connected)do

begin
try
for con :=0 to DataQueue.Count-1do
begin
if NeedUpdateContext then
Synchronize(HandleInput);
// 通过IdTCPClient发送数据
DataQueue.Delete(0);
end;
except
end;
end;
end;
NeedUpdateContext是一个函数,你必须自己实现,功能是判断有没有刷新窗体的必要。
另外记得在适当的时候使用Application.Processmessage,让系统喘口气,有时间接收处理你新的鼠标键盘信息。
 
我也遇到过这个问题,加上延时试试看!
DataQueue.Delete(0);
Sleep(1);
//加上这行
 
应该在while循环内加sleep:
procedure TSendHandleThread.Execute;
begin
while not Terminateddo
begin
sleep(100);

if not form1.Client.Connected then
Terminate
else
try
for con :=0 to DataQueue.Count-1do
begin
Synchronize(HandleInput);
// 通过IdTCPClient发送数据
DataQueue.Delete(0);
end;
except
end;
end;
end;
 
Synchronize(HandleInput);
// 通过IdTCPClient发送数据
是不是这里的原因,没用过IdTCPClient,不知它是不是线程安全,你可以把IdTCPClient在线程中创建,这样就可以去掉Synchronize,效率应该会有提高吧
当然加上sleep也应该有效果吧
 
To:思梦
这样不行,这是个独立运行的线程,没有TSendHandle.
To:雪鹰
加了SendHandleThread.Priority:=tpIdle;后,CPU使用率降到82%左右,
注销Synchronize(HandleInput);

if DataQueue.Count>0 then
for con :=0 to DataQueue.Count-1do
begin
Synchronize(HandleInput);
DataQueue.Delete(0);
end;
except
end;
后,CPU使用率还是90%左右.
To:coolqiang
不行,只是加的地方不对,skadon的方法就可以.
To:skadon
你的方法可行,sleep(1),CPU使用率0-2%左右
 
问题解决,发分啦.
 
增加sleep(1)方法可行,也可以增加
Application.ProcessMessages
让其他线程处理自己的信息。
 
各位高手有空在看看我的另一各问题吧,其实和这个是一起的,不过是300分哦
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2270734
 
后退
顶部