多线程CPU占有率高的问题,如何解决?(0分)

  • 主题发起人 主题发起人 zxsdelphi
  • 开始时间 开始时间
Z

zxsdelphi

Unregistered / Unconfirmed
GUEST, unregistred user!
我用多线程发送数据的同时,向MEMO1显示发送的字符,会占用22%左右的CPU,如果不向MEMO1显示的话,CPU占有率不到1%,不知怎么回事?
procedure TxThread.Execute;
begin
//线程循环
{ Place thread code here }
repeat
sleep(5);
if DisplayStop=0 then

if QuestTime[ComNo]=0 then
synchronize(SendQuest);//(TxSendObj.QuestAllBw);
//(QuestAllBw1)
until Terminated;
end;

procedure TxThread.SendQuest();//所有的通讯请求
var
sbuf:array[0..250] of byte ;
Msg:TMyMsg;
i:integer;
begin
/ nd_ComBwflag[]
{ sbuf[0]:=setcom[ComNo][0];
for i:=1 to 255do
sbuf:=i;
}
form1.Memo1.Lines.Add('口');//就是这句不要的话,CPU占有率很小
QuestTime[ComNo]:=10;
//+inttostr(setcom[ComNo][0])+'已收到发送数据');
// sio_write(setcom[ComNo][0],@sbuf,256);
{
Msg.Msg:=2000+ComNo;
Msg.MsgLenth := ComNo;
unit1.TxSendObj.Dispatch(Msg) ;
}
end;
 
大家都不知道怎么处理吗
 
向主窗口的Memo1写内容增加的性能花费,第一是它须要把添加动作放到主线程的消息队列,第二就是Memo1本身添加显示时花费的性能。
第一个,从机制上来说不太可能花费太多CPU的
第二个嘛,本来Memo添加显示文本花费的CPU就比较高,我想你的线程应该是存在大量的Memo1添加操作是吧。
解决办法我觉得可以这样,先把要显示的内容存放在String或是TSTrings中,再一次更新到Memo1.
 
多谢晚起的小虫!我用了自定义消息,通过消息发送向memo1添加字符,但一样达20%左右。更新到Memo1是怎样作的呢?
 
字符操作本来就非常的消耗cpu,其实是消耗内存带宽
多线程在内存贷款出现消耗的时候优势不是太明显
 
我也碰到过这样的问题,但没有很好的深入思考和解决,期待高手指教
 
楼上的人说到几个问题,第一MEMO添加本身是需要耗时间的,你可以在定义个队列变量,Tstings,Tstringlist,都成,其它的可以针对变量来操作,你试一下,占有率会不会少点
 
把Form1.Memo1.Add('')那一句放在另外synchronize的程序中调用,把SendQuest放在synchronize外面。是否可以降低?
 
只要在同步中向MEMO添加字符就很明显占用CPU,除非在其中sleep(1000).我尝试过在SendQuest中分发消息,在消息中去Form1.Memo1.Add(''),但一样占用,除非不用这句Form1.Memo1.Add('*****')。定义变量队列是怎么操作的呢?PROLOVE可否详细指点一下?
可否写个例子?
 
建议试试这种方法,用一个线程来接收需要add的text,然后这个线程定期向主线程发消息成批把多个信息一次加到主Form中
个人的分析是由于每次Add的时候都要重画Memo导致的占用大 所以应想办法减少重画次数
 
多谢ball_cao,我试试看
 
后退
顶部