Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 17-03-2010
rmora rmora is offline
Miembro
 
Registrado: may 2006
Posts: 10
Poder: 0
rmora Va por buen camino
Optimizacion del Uso de la memoria

Hola amigos,
Tengo una aplicacion en delphi5 en la cual estoy optimizando el uso de la memoria. Ahora bien, para liberar la memoria que utilizan mis formularios estoy utilizando las siguientes sentencias en el evento Close de cada formulario:

procedure TFrmVentasClienteExpress.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := caFree;
FrmVentasClienteExpress := Nil;
FrmVentasClienteExpress.Free;
end;


En mis consultas estoy utilizando lo siguiente:

qry1:= CrearConsulta ('SELECT CUENTA FROM FACTURA_BISTRO WHERE ESTATUS > 0 AND CUENTA_PRINCIPAL = "' + qry1.fieldbyname('CUENTA').AsString + '"');
result := qry2.RecordCount > 0;
qry1 := Nil;
qry1.Free;

Mi consulta en base a esto es la siguiente: Estoy utilizando de buena manera el codigo para optimizar el uso de la memoria??.
Responder Con Cita
  #2  
Antiguo 17-03-2010
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.025
Poder: 27
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Cita:
Empezado por rmora Ver Mensaje
Mi consulta en base a esto es la siguiente: Estoy utilizando de buena manera el codigo para optimizar el uso de la memoria??.
No.











Vaaaaale, te daré una pista.

Fíjate que primero estás asignando "Nil" a la variable y después llamas a "Free". Piénsalo.

(Disculpa la broma )
Responder Con Cita
  #3  
Antiguo 17-03-2010
mcs mcs is offline
Miembro
 
Registrado: may 2007
Ubicación: Girona
Posts: 229
Poder: 20
mcs Va por buen camino
Cita:
Empezado por rmora Ver Mensaje

FrmVentasClienteExpress := Nil;
FrmVentasClienteExpress.Free;
Lo normal sería que esto te tirase una Error Access Violation Exception... Si lo haces al revés (primero el Free y luego asignar el Nil), tiene que funcionar.

De todas formas, en una época dónde la cantidad de RAM se mide en gigas y ya hay discos duros de terabyte, vale la pena perder el tiempo en salvar una docena de kbytes? (Programando en microcontroladores ya es otra cosa...)
Responder Con Cita
  #4  
Antiguo 17-03-2010
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.025
Poder: 27
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Cita:
Empezado por mcs Ver Mensaje
De todas formas, en una época dónde la cantidad de RAM se mide en gigas y ya hay discos duros de terabyte, vale la pena perder el tiempo en salvar una docena de kbytes?
Por supuesto que sí. ¡Menuda pregunta!

Te pongo un ejemplo. Estoy trabajando en una tienda web en PHP. Las facturas las genera y almacena en disco en formato PDF. Pues bien, si intenta generar más de una factura en una tanda no nos lo permite por falta de memoria. Incluso aumentando el límite impuesto por PHP y Apache a 132 Mib (que es una burrada para una aplicación web) no permite generar más de ocho facturas de una única página. Y el problema es que tampoco permite hacer más de ocho incluso generándolas una a una, guardándolas en disco y eliminando el objeto con "unset" nada más guardarla, antes de generar la siguiente. ¿La razón? Simple: quien diseñó la clase que utilizamos para generar el PDF (no lo hemos hecho nosotros) pensó que no era tan importante optimizar la memoria, de forma que cada vez que se utiliza deja un montón de datos "huérfanos" que ocupan varias decenas de megas por documento, y al final revienta.

No nos engañemos porque nuestra computadora tenga cientos de gigas de memoria y varios teras en la partición de intercambio: la memoria sigue siendo y será siempre un bien preciado y debe ser utilizado con cabeza.

Última edición por Ñuño Martínez fecha: 17-03-2010 a las 10:37:41.
Responder Con Cita
  #5  
Antiguo 17-03-2010
mcs mcs is offline
Miembro
 
Registrado: may 2007
Ubicación: Girona
Posts: 229
Poder: 20
mcs Va por buen camino
Cita:
Empezado por Ñuño Martínez Ver Mensaje
No nos engañemos porque nuestra computadora tenga cientos de gigas de memoria y varios teras en la partición de intercambio: la memoria sigue siendo y será siempre un bien preciado y debe ser utilizado con cabeza.
Por supuesto que la memoria es y será siempre un bien preciado, pero a lo que yo me refiero es que con "programar con cabeza" es suficiente.

Todavía soy muy novato en Delphi (lo mio era Java y VB.NET), y por lo que veo, por norma general los forms son creados en memoria cuando se inicializa la aplicación (no es como el java, que lo normal era form=new MiJFormulario(); form.showModal(); form=null), y por tanto es el propio Delphi quien lo destruye.

En otras palabras, yo soy partidario de destruir/liberar ÚNICAMENTE lo que yo he creado. Si lo ha hecho el IDE, o una clase por mi, debe ser el IDE o la citada clase quien libere los recursos que ha pedido.

Saludos,

Marc
Responder Con Cita
  #6  
Antiguo 17-03-2010
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.669
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Cita:
Empezado por mcs Ver Mensaje
[..]En otras palabras, yo soy partidario de destruir/liberar ÚNICAMENTE lo que yo he creado. Si lo ha hecho el IDE, o una clase por mi, debe ser el IDE o la citada clase quien libere los recursos que ha pedido.
Saludos,
Marc
Es así.

Tú sólo tienes que liberar lo que tú has creado.
En tu caso:
Código:
procedure TFrmVentasClienteExpress.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
       Action := caFree;
//  FrmVentasClienteExpress := Nil; 
//  FrmVentasClienteExpress.Free;  
end;
Código:
qry1:= CrearConsulta ('SELECT CUENTA FROM FACTURA_BISTRO WHERE ESTATUS  > 0 AND CUENTA_PRINCIPAL = "' + qry1.fieldbyname('CUENTA').AsString +  '"');
result := qry2.RecordCount > 0;
//qry1 := Nil;
//qry1.Free;
Y este caso, si qry1 es un query que has creado tú, puedes eliminarlo con:
Código:
FreeAndNil(qry1)
Y fíjate en lo que te ha dicho Ñuño, primero free, luego pones a nil
Responder Con Cita
  #7  
Antiguo 17-03-2010
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Hola,
Código Delphi [-]
procedure TFrmVentasClienteExpress.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := caFree;
FrmVentasClienteExpress := Nil;
FrmVentasClienteExpress.Free;
end;

creo que aqui iria mejor el .Release. Un saludo.

PD: self.release incluso, aunque estes trabajando con solo una instancia de TFrmVentasexpress.
PDD: mas o menos lo que dijo casimiro en su primer parrafo
Responder Con Cita
  #8  
Antiguo 17-03-2010
rmora rmora is offline
Miembro
 
Registrado: may 2006
Posts: 10
Poder: 0
rmora Va por buen camino
Efectivamente Casimiro, Los formularios los creo Yo segun este codigo:

If not Assigned(FrmVentasClienteExpress) then
FrmVentasClienteExpress := tFrmVentasClienteExpress.Create(Self);

Luego lo muestro y posteriormente en el Close desearia liberar la memoria

Si lo hago segun este codigo me despliega un mensaje de "access violation":

procedure TFrmVentasClienteExpress.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := caFree;
FrmVentasClienteExpress.Free;
FrmVentasClienteExpress := Nil;
end;

Pero si lo hago de esta manera funciona:

procedure TFrmVentasClienteExpress.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := caFree;
FrmVentasClienteExpress := Nil;
FrmVentasClienteExpress.Free;
end;

No se si de esa manera el Free posterior al nil esta sobrando osea dejar algo asi:

procedure TFrmVentasClienteExpress.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := caFree;
FrmVentasClienteExpress := Nil;
end;


Tambien estuve utilizando este codigo:

If not Assigned(FrmVentasClienteExpress) then
FrmVentasClienteExpress := tFrmVentasClienteExpress.Create(Self);
Try
FrmVentasClienteExpress.ShowModal;
finally
FrmVentasClienteExpress.Free;
FrmVentasClienteExpress := Nil;
end;
Aca el problema esta en que si ocurre una excepcion el sistema se queda congelado "pegado" y hay que volcar la tarea desde el administrador de tareas de windows.

Que piensan.....

Gracias por la valiosa ayuda!!!

Última edición por rmora fecha: 17-03-2010 a las 17:22:39.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Curiosidad sobre optimización de memoria REHome .NET 1 21-12-2009 17:07:31
Optimización! Optimización! PiornoCKA&G Varios 1 31-12-2006 20:45:30
Optimización de corte felixgo Varios 1 14-10-2004 11:04:33
optimizacion del SQL seb@ SQL 1 22-09-2004 19:55:24
Optimizacion manuelpr Conexión con bases de datos 3 30-07-2004 17:26:24


La franja horaria es GMT +2. Ahora son las 07:36:05.


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