PDA

Ver la Versión Completa : Mi Servicio consume Mucha memoria


IcebergDelphi
03-09-2010, 18:24:03
Hola amigos, acabo de crear un Servicio que envia por FTP un archivo de Texto al Servidor FTP, en el cual estoy usando Threads (Hilos) y practicamente hace lo siguiente:
1.-Mi Servicio esta Monitoriando Una carpeta de mi equipo, en el cual esta a la espera de que entre un archivo de Texto llamado Factura.txt, que manda el ERP de Facturacion cada vez que el usuario manda a facturar.

2.- Una vez que mi servicio detecta que entro el archivo llamado Factura.txt este lo envia al FTP.

3.- Por Ultimo mi servicio Borra el Archivo Factura.txt de la Carpeta de recepcion de mi equipo.


Hasta ahi todo bien, el unico problema fue que al entrar al administrador de tareas vi que estaba haciendo mucho uso de memoria y va aumentando, por ejemplo he visto que de:27,000 kb va subiendo poco a poco, y en la columna CPU oscila entre 80 y 90 ,yendome a la pestaña rendimiento pude ver que la grafica del Historial de Uso de CPU se dispara.
Esto no me alenta el equipo pero si se traga mucha memoria.

Que podria haber pasado por alto? recuerden que estoy usando Hilos, no quise meter un Timer por que pense que usaria mas memoria, pero
salio lo contrario.
PD: Uso Indy IdFTP

Espero sus opiniones, muchas gracias.

IcebergDelphi
03-09-2010, 19:10:25
Hola amigos, acabo de crear un Servicio que envia por FTP un archivo de Texto al Servidor FTP, en el cual estoy usando Threads (Hilos) y practicamente hace lo siguiente:
1.-Mi Servicio esta Monitoriando Una carpeta de mi equipo, en el cual esta a la espera de que entre un archivo de Texto llamado Factura.txt, que manda el ERP de Facturacion cada vez que el usuario manda a facturar.

2.- Una vez que mi servicio detecta que entro el archivo llamado Factura.txt este lo envia al FTP.

3.- Por Ultimo mi servicio Borra el Archivo Factura.txt de la Carpeta de recepcion de mi equipo.


Hasta ahi todo bien, el unico problema fue que al entrar al administrador de tareas vi que estaba haciendo mucho uso de memoria y va aumentando, por ejemplo he visto que de:27,000 kb va subiendo poco a poco, y en la columna CPU oscila entre 80 y 90 ,yendome a la pestaña rendimiento pude ver que la grafica del Historial de Uso de CPU se dispara.
Esto no me alenta el equipo pero si se traga mucha memoria.

Que podria haber pasado por alto? recuerden que estoy usando Hilos, no quise meter un Timer por que pense que usaria mas memoria, pero
salio lo contrario.
PD: Uso Indy IdFTP

Espero sus opiniones, muchas gracias.

Perdon se me olvidaba la parte del codigo on Execute del Servicio lo cual llama al Hilo :


procedure TMyServiceCFD.ServiceExecute(Sender: TService);
begin
MainThread:=VigilanteUnidad.Create(True);
With MainThread Do
Begin
FreeOnTerminate:=True;
Resume;
end;
while not Terminated do
begin
ServiceThread.ProcessRequests(True);
With MainThread Do
Begin
FreeOnTerminate:=True;
end;

end;
end;

escafandra
03-09-2010, 19:20:47
Y ¿como vigilas la carpeta que debe recibir el archivo.txt?

Saludos.

IcebergDelphi
03-09-2010, 19:34:21
Y ¿como vigilas la carpeta que debe recibir el archivo.txt?

Saludos.

Hola escafandra, como te decia tengo una unidad llamada Hilo que realmente es un Trhead, lo chistoso de esto es que tengo una aplicacion que hice ya tiene 2 años atras que igualmente me vigila la carpeta que yo asigne y no me consume memoria, yo creo que es el servicio que hace un continuo loop te paso una parte del codigo del Thread:


procedure VigilanteUnidad.Execute; //Se ejecutara el Hilo cada vez que haya algun cambio en algun archivo
Var
hNotif: THandle;
P:PAnsiChar;
begin
SDirVigilar:=P;
P:=PAnsiChar(SDirVigilar);
hNotif := FindFirstChangeNotification(P,False,FILE_NOTIFY_CHANGE_FILE_NAME Or FILE_NOTIFY_CHANGE_DIR_NAME );
While True do // Ejecutar siempre
Begin
WaitForSingleObject(hNotif, INFINITE); // Esperamos que se produzca una modificación
//Syncronize es una funcion o procedimiento del Hilo, que nos servira para llamar a los procedimientos que queramos
Synchronize(LeeIni);
FindNextChangeNotification(hNotif); // y esperamos la siguiente notificación
end;
end;



ese mismo codigo uso para la aplicacion que hice hace 2 años y no tengo problemas de memoria todo esta relax.

Saludos.

mamcx
03-09-2010, 19:36:47
El administrador de tareas no es confiable para medidas precisas.

Usa http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx.


Si la memoria sube y sube, tienes un memory leak. Debes tener variables que no estas liberando.

IcebergDelphi
03-09-2010, 19:52:33
El administrador de tareas no es confiable para medidas precisas.

Usa http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx.


Si la memoria sube y sube, tienes un memory leak. Debes tener variables que no estas liberando.


Gracias Mamcx, ya estoy bajando el soft de la liga, seguire checando mi codigo y les paso despues el resultado.

IcebergDelphi
04-09-2010, 02:32:11
Gracias Mamcx, ya estoy bajando el soft de la liga, seguire checando mi codigo y les paso despues el resultado.

Les comentare que vine terminando el problema usando un Timer, no se si el Servicio actua como un Loop, pero cuando usaba el Thread se ejecutaba sin parar el Hilo, aun que para mi era mejor ya que al llegar la Factura.txt a la carpeta se disparaba el envio del FTP en menos de un segundo, con el Timer tarda 2 segundos y eso que tengo el Interval a 1000, en fin me quedare con el Timer. saludos y gracias.

:(

dalyla2010
27-12-2010, 21:37:27
Mmm a mi me pasa lo mismo con un procedimiento, pero no supe como liberar las variables, use una funcion para liberar la memoria, y si me ayudo, pero aun asi sigue aumentando la memoria. Se supone que cada que llamo una funcion vuelve a tomar espacio en memoria, y cuando la termino de usar ya no la libera? alguien lo puede aclarar?