Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Mi Servicio consume Mucha memoria (https://www.clubdelphi.com/foros/showthread.php?t=69719)

IcebergDelphi 03-09-2010 18:24:03

Mi Servicio consume Mucha memoria
 
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

Cita:

Empezado por IcebergDelphi (Mensaje 375478)
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 :

Código Delphi [-]
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

Cita:

Empezado por escafandra (Mensaje 375484)
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:

Código Delphi [-]
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/s.../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

Cita:

Empezado por mamcx (Mensaje 375489)
El administrador de tareas no es confiable para medidas precisas.

Usa http://technet.microsoft.com/en-us/s.../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

Me quedare con el timer
 
Cita:

Empezado por IcebergDelphi (Mensaje 375492)
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?


La franja horaria es GMT +2. Ahora son las 15:32:35.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi