Bueno, solo para comentarles, el problema sigue alli, despues de actualizar a Indy9 (D6 venia con Indy 8... tuve que hacer bastantes cambios para actualizar). De paso, cai en la cuenta de un problema con los threads, que ya solucione, pero lo del 100% de CPU se resiste a desaparecer. A veces son mas de 5 minutos, pero no veo un patron.
Dentro de la misma aplicacion tengo otro servidor TCP, en otro puerto, aunque alli suele haber una o dos conexiones, y ese no me causa problemas.
A continuacion una version simplificada del codigo OnExecute del servidor TCP:
Código Delphi
[-]
procedure TfrmMyServer.ServerTCPExecute(AThread: TIdPeerThread);
var
Data :string;
MyThread:TMyThread;
Client :TMyClient;
begin
if AThread is TMyThread then
MyThread:=TMyThread(AThread)
else
MyThread:=nil;
with AThread.Connection do
begin
try
Data:=readln('',TCPReadlnTimeout);
except on E:Exception do
begin
Data:='';
end;
end;
if not(AThread.Connection.Connected) or not(ServerTCP.Active) or (AThread.Terminated) then
exit;
if shuttingdown then
exit;
if(Data <> '') then
begin
if MyThread<>nil then
begin
Client := MyThread.Client;
if Client<>nil then
begin
Client.Data:=GetReport;
Client.PeerIPTCP := athread.Connection.Socket.Binding.PeerIP;
Client.portTCP := athread.Connection.Socket.Binding.PeerPort;
AThread.Synchronize(TMyThread.ProcessTCP);
end;
end;
end;
end;end;
procedure TMyThread.ProcessTCP;
var
data:string;
IpAddr:string;
IpPort,ID:Integer;
begin
data:=Client.Data;
ipAddr:=Client.PeerIPTCP;
ipPort:=Client.portTCP;
ProcessPackage(data,ipAddr,ipPort,ID,PROTO_TCP);
Client.ID:=ID;
end;
donde ProcessPackage es una rutina que parsea la data y actualiza la base de datos usando ADO, y devuelve un ID.
Sin embargo, aun si pongo entre comentarios esa llamada, es decir, no hago nada en la base de datos, de todas formas sigue disparandose el uso de CPU. Alguna idea?