如何解决使用IdTcpServer时CPU利用率很高的问题? (200分)

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

qlj

Unregistered / Unconfirmed
GUEST, unregistred user!
程序主要功能就是使用IdTcpServer将数据发送给每个连接的IdTcpClient我试过两种方法.
但是服务端程序的CPU利用率很高,占用了所有资源.我试过用Application.ProcessMessages
但是无效,我又禁止了所有界面的操作也没用.没发数据的时候也一直居高不下,我用了IdAntiFreeze也没什么效果,还有用了IdThreadMgrPool也没用,
程序虽然能正常运行,但CPU利用率却这么高,没道理呀,难道是我的程序处理逻辑有问题?还是有什么其他地方没考虑或设置周到?
那位有类似的代码参考一下,或者有没有什么其他更好的方法,功能要求简单:只要将数据从服务端单方向发送给每给客户端就可以了(不考虑用UDP,不考虑用广播包,因为需要他能在INTERNET上运行)

方法一:SERVER端使用EXECUTE发送,客户端建立一个线程接收
procedure TCastProxy.TCPServerExecute(AThread: TIdPeerThread);
begin
// application.ProcessMessages;
try
athread.Connection.WriteStream(tempclient.ClientData,true,true,0);
tempclient.ClientData.Clear;
except
on e:exception do begin
Athread.Connection.Disconnect;
end;
end;
end;

procedure TCastProxy.TcpClientThreadRun(Sender: TIdCustomThreadComponent);
var
Adata:TmemoryStream;
begin
AData:=TmemoryStream.Create;
// application.ProcessMessages;
if assigned(Adata) then begin
if Tcpclient.Connected then begin
// Adata.Clear;
try
tcpclient.ReadStream(Adata,-1,false);
// .........
except
on e:exception do begin
tcpclient.Disconnect;
end;
end;
end else begin
try
Tcpclient.Connect(1000);
except
on e:exception do
statusbar.SimpleText:=e.Message;
end;
end;
end;
Adata.Free;
end;

方法二:SERVER端使用循环发送给每个客户,客户端使用线程接收
if TcpServer.Active then begin
try
Threads:=Tcpserver.Threads.LockList;
for temp:=0 to Threads.Count-1 do begin
try
adata.Position:=0;
TIdPeerThread(Threads[temp]).Connection.WriteStream
(Adata,true,true,adata.Size);
except
On E:Exception do
TIdPeerThread(Threads[temp]).Connection.Disconnect;
end;
end;
finally
TcpServer.Threads.UnlockList;
end;
end;
 
一连接一线程确实占CPU资源,只要连接不是太多,一般应该还好.
 
谢谢,这点我在看你回复别人的帖子时已经了解,但是目前我只做了几个连接
哪怕是只有一个连接也是这样,占用全部CPU资源。其他程序如果运行的话,他的
利用率会下来点。没道理这样呀。没次我传的数据都不大呀,1-2K而已
我用过IdMappedTcpPort,用他做几十个客户端到服务端的端口映射的利用率都很低,只有
2-5而已,而且传送的数据有时高达几M呢。
郁闷。。。。。。
 
没人用IdTcpServer做程序了吗?

我用IdTcpClient向IdTcpServer发数据,程序的利用率一点也不高,怎么反过来就不
同了呢?用的函数都一样呀。
 
哈哈,自己解决了.
怪自己没有好好看列子.
 
接受答案了.
 
后退
顶部