Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-03-2014
jlrbotella jlrbotella is offline
Miembro
 
Registrado: ene 2007
Posts: 185
Poder: 18
jlrbotella Va por buen camino
Liberar forms

Hola compañeros:

¿Sabéis como se puede liberar la memoria de un Form?. Actualmente realizo estos procedimientos, pero realmente no me libera la memoria:

Ejemplo 1

Código Delphi [-]
var
  fVentana : TForm2;
begin
  try
    fVentana := TForm2.Create(nil);
    fVentana.ShowModal;
  finally
    fVentana.free;
  end;

  ShowMessage(fVentana.variable); // Aquí debería fallar pero no lo hace
end;

Ejemplo 2

Código Delphi [-]
var
  fVentana : TForm2;
begin
  try
    fVentana := TForm2.Create(nil);
    fVentana.ShowModal;
  finally
    fVentana.free;
    fVentana := nil;
  end;

  ShowMessage(fVentana.variable); // Aquí falla
end;
Responder Con Cita
  #2  
Antiguo 26-03-2014
Avatar de olbeup
olbeup olbeup is offline
Miembro
 
Registrado: jul 2005
Ubicación: Santiago de la Ribera (España)
Posts: 685
Poder: 19
olbeup Va camino a la fama
Cita:
Empezado por jlrbotella Ver Mensaje
Hola compañeros:

¿Sabéis como se puede liberar la memoria de un Form?. Actualmente realizo estos procedimientos, pero realmente no me libera la memoria:

Ejemplo 1

Código Delphi [-]
var
  fVentana : TForm2;
begin
  try
    fVentana := TForm2.Create(nil);
    fVentana.ShowModal;
  finally
    fVentana.free;
  end;

  ShowMessage(fVentana.variable); // Aquí debería fallar pero no lo hace
end;

Ejemplo 2

Código Delphi [-]
var
  fVentana : TForm2;
begin
  try
    fVentana := TForm2.Create(nil);
    fVentana.ShowModal;
  finally
    fVentana.free;
    fVentana := nil;
  end;

  ShowMessage(fVentana.variable); // Aquí falla
end;
Hola jlrbotella,

El Ejemplo 2, es la mejor forma de hacerlo, también está el FreeAndNil(fVentana) que hace lo mismo pero en una sola línea.

Un saludo.
__________________
Al hacer una consulta SQL, haz que los demás te entiendan y disfruten de ella, será tú reflejo de tú saber.
Responder Con Cita
  #3  
Antiguo 26-03-2014
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.267
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
En realidad ambos son iguales en cuanto a la liberación de memoria, ya que la instrucción que realmente libera la memoria es el FREE. La asignación a nil, simplemente asigna ese valor a la variable que apunta al form, pero en ese momento la memoria ya se ha liberado(*).

(*)Recuerda, que el sistema no libera la memoria inmediatamente, así que si miras la memoria que consume tu programa, tal vez después de hacer el FREE, la cantidad de memoria libre siga siendo la misma que antes de hacerlo; Es normal, pues lo que hace el sistema es "marcar" determinada memoria, como que está "libre", pero no la libera en ese momento de forma explícita. Queda marcada y en el momento que el sistema la necesita "recopila" esas zonas "marcadas para liberar" y las "libera" todas al mismo tiempo.

Tal como comenta [olbeup], puedes usar un FreeAndNil, que lo que hace es hacer el FREE y la asignación en una misma instrucción(línea).

La asignación a NIL, aunque no es obligatoria, si es recomendable si posteriormente utilizas instrucciones como esta:

Código Delphi [-]
  if Assigned(miForm)...
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 26-03-2014
Avatar de radenf
radenf radenf is offline
Miembro
 
Registrado: oct 2007
Ubicación: Viña del Mar,Chile
Posts: 608
Poder: 17
radenf Va por buen camino
Estimado jrlbotella :

En este link se muestran otras alternativas.
Yo utilizo en mis programas el código que se muestra en el hilo #10, con exelentes resultados, que se pueden comprobar en el Administrador de tareas.

Saludos
Responder Con Cita
  #5  
Antiguo 26-03-2014
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.267
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
El truco que comenta [radenf], tal y como explica Ian Martins aquí es "obligar" al sistema a liberar la memoria que tu programa tiene en ese estado "marcada para liberar" que he comentado antes.

El problema es que hay quien piensa que eso puede no ser todo lo beneficioso que a priori parece. Es decir, de alguna forma le estamos diciendo al sistema (obligándole) que queremos que liberar la memoria de nuestro proceso, cuando el sistema tiene su propio sistema de liberación. En cierta manera estamos interfiriendo en el correcto(normal) funcionamiento de este proceso.
¿Y si el sistema piensa que es mejor liberar la memoria de otro proceso, en lugar del nuestro?
¿Y si el sistema puede coger memoria de otro lugar sin necesidad de liberarla ahora (de nuestro proceso o de ningún otro)?
¿Y si el sistema piensa que ahora no es el momento de liberar?
¿...?

Lo que quiero decir es que no va a pasar nada por hacerlo, pero a lo mejor en algunos casos lanzar este proceso cada X tiempo, puede empeorar el rendimiento en lugar de mejorarlo (link -si buscas encontarás otros similares-).
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #6  
Antiguo 26-03-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
El "método Marteens" lo he usado desde siempre ¿1998? y con muy buenos resultados.
Responder Con Cita
  #7  
Antiguo 26-03-2014
Avatar de radenf
radenf radenf is offline
Miembro
 
Registrado: oct 2007
Ubicación: Viña del Mar,Chile
Posts: 608
Poder: 17
radenf Va por buen camino
Yo lo utilizo en mi programa para visualizar imágenes médicas en formato Dicom, que eleva el uso de la Ram en mas de 1Gb cada vez que cargo un nuevo examen (500-1500 Imágenes) y funciona a la perfección. Si no lo utilizo al cargar el segundo o tercer examen recibo el fatídico mensaje de que no dispongo de memoria suficiente.

Salu2
Responder Con Cita
  #8  
Antiguo 26-03-2014
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
En mi opinión, los tres últimos mensajes (Neftalí, Casimiro y radenf) llevan razón.

El método de Marteens no tiene porqué fallar, como dice Casimiro, pero sí puede hacer la aplicación un poquillo menos eficiente (aunque en muchas ocasiones sea casi imperceptible) pues, como dice Neftalí, el sistema puede tener un mejor momento para hacer su trabajo (podemos pedirle al intendente que limpie nuestro lugar cada vez que derramamos un poco de café pero no es realmente necesario y el intendente hará mejor su trabajo si no lo interrumpimos a cada momento).

Pero habrá situaciones como las que describe radenf en que el uso de memoria es tan demandante que sea preferible limpiar cuanto antes (por ejemplo, si se nos cae toda la taza de café, seguramente convendrá llamar al intendente de inmediato).

// Saludos
Responder Con Cita
  #9  
Antiguo 27-03-2014
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
La mejor forma de liberar la memoria utilizada por un formulario es hacerlo en el evento OnClose. Asignas la acción de cerrar a caFree. De esta forma el formulario se liberará automáticamente y evitas estarlo liberando en cada código donde lo utilices. Por ejemplo:

Código Delphi [-]
procedure TForm2.OnClose(Sender: TObject, var Action: TCloseAction);
begin
    // liberar memoria actomáticamente
    action := caFree;
end;

Con lo anterior, tu código se simplicaría:
Código Delphi [-]
var
  fVentana : TForm2;
begin
  try
    fVentana := TForm2.Create(nil);
    fVentana.ShowModal();
  finally
    // do nothing
  end;
end;
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #10  
Antiguo 27-03-2014
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.267
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Chris Ver Mensaje
La mejor forma de liberar la memoria utilizada por un formulario es hacerlo en el evento OnClose.
El problema es que a veces necesitas acceder al formulario (por ejemplo a una de sus propiedades) después de cerrarlo.
Para eso existen otras opciones como caHide.

En esos casos no puedes liberarlo de esa forma, así que yo no diría que es la "mejor". Simplemente es la adecuada para unas situaciones y no es adecuada para otras.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #11  
Antiguo 27-03-2014
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Bueno, hablando de simplificaciones al usar formularios, yo prefiero escribir:
Código Delphi [-]
TForm1.Execute;  // Esto crea el formulario, llama a ShowModal y lo libera al cerrarse
El secreto es cambiar la declaración:
Código Delphi [-]
  TForm1 = class(TForm)
por:
Código Delphi [-]
  TForm1 = class(TghForm)

TghForm, que deriva de TForm, es una de las clases de GH Freebrary.

Un saludo.

Al González.
Responder Con Cita
  #12  
Antiguo 27-03-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Neftali Ver Mensaje
El problema es que a veces necesitas acceder al formulario (por ejemplo a una de sus propiedades) después de cerrarlo.
Para eso existen otras opciones como caHide.
En esos casos no puedes liberarlo de esa forma, así que yo no diría que es la "mejor". Simplemente es la adecuada para unas situaciones y no es adecuada para otras.
Ocurre muchas veces.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Liberar el DataModule Cañones OOP 5 13-10-2010 12:40:17
Liberar DLL acertij022 Varios 1 26-06-2008 16:38:05
TSHFileInfo, se ha de liberar? [Gunman] API de Windows 4 28-11-2005 21:14:36
Liberar Objetos II OscarG OOP 12 11-10-2005 10:13:55
Liberar un objeto xerkan Servers 1 28-10-2003 17:29:10


La franja horaria es GMT +2. Ahora son las 07:41:00.


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
Copyright 1996-2007 Club Delphi