Club Delphi  
    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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-01-2004
jac000y jac000y is offline
No confirmado
 
Registrado: May 2003
Posts: 14
Poder: 0
jac000y Va por buen camino
manejo de la memoria en delphi

Estoy trabajando con Delphi 7 y Windows 2000

1. ejecuto una aplicacion hecha en delphi

2. abro el administrador de tareas de windows 2000 y voy
a la solapa procesos y Mi aplicacion ocupa una cierta cantidad de
memoria

3. abro una ventana en Mi aplicacion y veo que en el administrador de
tareas de windows, mi aplicacion ocupa mas memoria,

PERO: cuando cierro la ventana (Form.Free), no vuelve a la cantidad
de memoria que estaba ocupando anteriormente, si no, un poco mas

4. despues de unos minutos la memoria se descarga, eso no seria problema

5. el problema es que si uso mi aplicacion continuamente, la cantidad de memoria se va incrementando constantemente.



6 ........ Hay alguna forma de ir liberando esa memoria??????


7. tiene algo que ver con el famoso error ? :

Access violation at address XXXXXXX. Read of address XXXXXXXX.



gracias a todos
Responder Con Cita
  #2  
Antiguo 29-01-2004
Avatar de marto
marto marto is offline
Miembro
 
Registrado: May 2003
Ubicación: Barcelona, Catalunya
Posts: 882
Poder: 15
marto Va por buen camino
Cita:
Empezado por jac000y
3. abro una ventana en Mi aplicacion y veo que en el administrador de
tareas de windows, mi aplicacion ocupa mas memoria,

PERO: cuando cierro la ventana (Form.Free), no vuelve a la cantidad
de memoria que estaba ocupando anteriormente, si no, un poco mas
Quando usas forms, tu aplicación está haciendo llamadas a funciones que están en dll's del sistema. Estas dll's no se descargan automáticamente, sino que tardan un tiempo. Eso explicaría el retraso.

Cita:
Empezado por jac000y

7. tiene algo que ver con el famoso error ? :

Access violation at address XXXXXXX. Read of address XXXXXXXX.
Pues puede ser.... si no nos dices el contexto en el que se produce...
__________________
E pur si muove
Responder Con Cita
  #3  
Antiguo 02-02-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: May 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.874
Poder: 20
delphi.com.ar Va por buen camino
Te recomiendo leer este artículo: Liberando memoria inactiva (Marteens)

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #4  
Antiguo 03-02-2004
i.larranaga i.larranaga is offline
Miembro
 
Registrado: Feb 2004
Posts: 26
Poder: 0
i.larranaga Va por buen camino
problemas con la memoria

Hola a todos,
yo tengo un problema parecido al comentado, mi programa va cogiendo y cogiendo RAM según se está ejecutando. He estado mirándolo un poco y resulta que por algún lado no libero memoria. Os pongo un ejemplo de una función del programa, el cual tiene el dicho problema:

function TForm.Funcion(const BMP: TBitmap): TBitmap;
var
x,y: Word;
Line1,Line2: PByteArray;
begin
//Crear y asignar BMP
Result:=TBitmap.Create;
Result.Assign(BMP);
//Recorre la imagen línea a línea
for y:=0 to Result.Height-1 do
begin
//Asigna los valores a los punteros
Line1:=BMP.ScanLine[y]; //*
Line2:=Result.ScanLine[y]; //*
//Recorre pixel a pixel
for x:=0 to Result.Width-1 do
begin
//Realiza operaciones
end;
end;
end;

La cuestión es que no sé porqué cuando hace * parece que se hace una copia de la imagen en memoria, y luego al acabar la función esta memoria no se libera y se va acumulando en sucesivas llamadas a la función.

He probado a hacer una copia de la variable de entrada y luego liberarlo con .Free, y así si he conseguido liberar la parte correspondiente de memoria, pero no consigo liberar la correspondiente a Result o a la salida.

¿Cómo podría conseguirlo? ¿Y porqúe si en * asigno punteros se crea una copia de la imagen y ocupa memoria?

Muchas gracias a todos por vuestra ayuda y un saludo.
Responder Con Cita
  #5  
Antiguo 03-02-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: May 2003
Ubicación: Guatemala
Posts: 6.243
Poder: 21
jachguate Va por buen camino
Cool

Cita:
Empezado por i.larranaga
parece que se hace una copia de la imagen en memoria, y luego al acabar la función esta memoria no se libera y se va acumulando en sucesivas llamadas a la función.
Pues no "parece que se hace una copia"... mas bien seguro que se hace una copia en:

Código:
  Result:=TBitmap.Create;
  Result.Assign(BMP);
Si queres que esa memoria se libere, la llamada de la función debiera ser algo como:

Código:
Var
  MyBMP : TBMP;
Begin
  MyBMP := Funcion(OtroBMP);
  try
    // hacer cosas;
  finally
    MyBMP.Free;
  end;
end
o bien:

Código:
Begin
  with Funcion(OtroBMP) do 
    try
      // hacer cosas;
    finally
      Free;
    end;
end;
ya que el objeto se crea dentro de la rutina, y no parece que liberes el recurso fuera, según tu explicación.

El hacer una copia de la variable de entrada y luego liberarla... no tiene sentido.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #6  
Antiguo 03-02-2004
i.larranaga i.larranaga is offline
Miembro
 
Registrado: Feb 2004
Posts: 26
Poder: 0
i.larranaga Va por buen camino
gestionando bien la memoria

Hola otra vez,

ya he probado lo que decías, y ahora la memoria que se reservaba para el Result ya la libero desde la función que llama a la que he expuesto. No obstante, te volveré a explicar mejor el problema. Cuando se llama a la función, como tú decías se copia la imagen con assign, pero todavía no aumenta la memoria en uso. Cuando hago line1:=... es cuando aumenta la memoria en uso, y también cuando hago line2:=... Como ésta última la libero después desde la función desde la que he llamado a ésta, quedaría resuelto, pero el line1:=... que se refiere a la variable de entrada (constante, no sé si esto influirá) es el que me da problemas ahora. Con esta asignación del linescan se reserva memoria, pero no se cómo liberarla luego, ya que no puedo hacer un Free de la variable de entrada, pues ésta se pierde.
¿Qué es lo que podría hacer con este problema?
Muchas gracias por tu ayuda y un saludo.
Responder Con Cita
  #7  
Antiguo 03-02-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: May 2003
Ubicación: Guatemala
Posts: 6.243
Poder: 21
jachguate Va por buen camino
La verdad nunca he usado el método ScanLine, y la documentación no es clara en cuanto a si reserva memoria o no. Dado que devuelve un puntero, te recomiendo que revises el código y/o documentación del API, y si reserva memoria, llamés al método adecuado para liberarla después de haber terminado de usarla.

Hasta luego.
__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #8  
Antiguo 03-02-2004
i.larranaga i.larranaga is offline
Miembro
 
Registrado: Feb 2004
Posts: 26
Poder: 0
i.larranaga Va por buen camino
Memoria ocupada por Bitmaps

Hola otra vez,
al final he tenido que hacer una copia a una variable local del parametro de entrada para asociarlo con el puntero, y luego una vez acabada la función he hecho un Free a esta variable. con esto he conseguido liberar la memoria. Se que no es lo óptimo pero funciona. Si encuentras la razón de mis problemas hazmelo saber, por favor. Muchas gracias por tu ayuda y un saludo.
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


La franja horaria es GMT +2. Ahora son las 03:02:30.


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