PDA

Ver la Versión Completa : Consulta sobre Web services y Delphi


Gercondi
05-07-2012, 22:36:57
Saludos a todos los que hacen parte de este foro.

Tengo una aplicación que contiene un modulo cliente y uno servidor. El modulo de servidor lee cada 5 segundos información de varios web services y la almacena en unos Tclientdataset, para que el modulo cliente pueda utilizar estos datos.

Mi duda es: Es normal que aún cuando estoy liberando (con Free()) todos los objetos que se crean (con Create()) para el llamado a los webservices la memoria virtual del proceso crezca aproximada mente un mega cada 2 horas?

Uno de los procesos que mas hace crecer la memoria virtual es el siguiente:

procedure LlamadosWS.getOperadores;
var
L_SPRCMXCRAFT: SPRCMXCRAFTQuery;
xORGID, xCRAFT : SPRCMXCRAFT1.Array_Of_MXStringQueryType;
ListaOperadores : SPRCMXCRAFTSet;
I : integer;
op_HTTPRIO : THTTPRIO;
begin
try
L_SPRCMXCRAFT := SPRCMXCRAFTQuery.Create;

SetLength(xORGID,1);
xORGID[0] := SPRCMXCRAFT1.MXStringQueryType.Create;
xORGID[0].&operator := SPRCMXCRAFT1.QueryOperatorType.igual;
xORGID[0].Text := _OrgID;

L_SPRCMXCRAFT.LABORCRAFTRATE := SPRCMXCRAFT1.LABORCRAFTRATE3.Create;
L_SPRCMXCRAFT.LABORCRAFTRATE.ORGID := xORGID;


SetLength(xCRAFT,1);
xCRAFT[0] := SPRCMXCRAFT1.MXStringQueryType.Create;
xCRAFT[0].Text := _ESPECIALIDADES;

L_SPRCMXCRAFT.LABORCRAFTRATE.CRAFT := xCRAFT;


op_HTTPRIO := THTTPRIO.Create(nil);
op_HTTPRIO.HTTPWebNode.UserName := Datamodule1.UsuarioCFZ;
op_HTTPRIO.HTTPWebNode.Password := Datamodule1.PasswordCFZ;


ListaOperadores := GetSPRCMXCRAFTPortType(False,'',op_HTTPRIO).QuerySPRCMXCRAFT(L_SPRCMXCRAFT);

L_SPRCMXCRAFT.Free;
xORGID[0].Free;
xCRAFT[0].Free;

with DataModule2 do
begin

CDS_Operadores_WS.EmptyDataSet;
CDS_Operadores_WS.Close;
CDS_Operadores_WS.Open;

Datamodule2.LimpiarCDS(CDS_Operadores_WS);

for I := 0 to Length(ListaOperadores) - 1 do
begin

try
if ListaOperadores[i].LABOR[0].STATUS.text = 'ACTIVO' then
begin
try
CDS_Operadores_WS.InsertRecord([ListaOperadores[i].LABORCODE.text,
ListaOperadores[i].LABOR[0].PERSON[0].FIRSTNAME.Text + ' ' + ListaOperadores[i].LABOR[0].PERSON[0].LASTNAME.Text,
ListaOperadores[i].CRAFT.text ,
ListaOperadores[i].LABOR[0].PERSON[0].STATUS.Text,
ListaOperadores[i].LABOR[0].PERSONID.Text]);
finally
ListaOperadores[i].Free;
end;

end;
except
Continue;
end;

end;
end;
finally
ListaOperadores := nil;
end;
end;

Ñuño Martínez
06-07-2012, 21:01:18
Es muy difícil responder. Sin embargo, he visto que al final asignas un nil a una variable. Recuerda que con eso no liberas memoria.

Me han recomendado muchas veces la herramienta Valgrind (http://valgrind.org/), aunque nunca la he usado por vagancia. Quizá te sirva para encontrar dónde reserva memoria que luego no libera.