PDA

Ver la Versión Completa : Liberar Memoria


MaMu
28-06-2007, 08:23:02
Existe alguna forma en la que yo, en determinado momento pueda liberar memoria RAM? Es que estoy trabajando una aplicacion que copia archivos (bmp y jpg) en cantidades del orden de las 1000 imagenes. Y si son muchas, me tira error de "Division by Zero" y la maquina se me queda sin memoria.

Saludos

Bicho
28-06-2007, 08:57:35
Hola mamu,

quizá éste (http://www.marteens.com/trick42.htm) link pueda ayudarte.

Saludos

MaMu
28-06-2007, 09:33:48
Hola mamu,

quizá éste (http://www.marteens.com/trick42.htm) link pueda ayudarte.

Saludos

Es interesante, pero en mi caso poco efectivo. Yo tengo un JvThumbView1, al cual le dibujo los thumbnails por codigo, creados a partir de TFrames, ya que los thumbnails de este componente no tienen CheckBox y yo lo necesitaba. La cuestion es que al numero de TFrame 230 creado ya me salta Floatting Pointer Division by Zero, en todos los demas restantes que va creando (unos 356 en total y a veces mas, pueden llegar a ser 1000) y la verdad es que no se como solucionarlo. Probe ocultando todo hasta que termine de crearse, pero es lo mismo. No se me ocurre que hacer.

Saludos

Lepe
28-06-2007, 13:36:04
Tendrás que averiguar qué rutina es la que lanza la excepción y por qué ocurre.

En tools -> options -> debugguer activa la casilla "Notify on Language Exception". Ejecuta el programa y al lanzar la excepción el depurador de delphi se parará, irá al código que está provocando la excepción. Mira el Call Stack (View -> debug -> Call Stack) donde verás las últimas llamadas que se han producido, así sabrás las últimas rutinas que se han ejecutado y que han lanzado la excepción.

Un buen punto para buscar, quizás sea donde se haga alguna división.

Quizás si muestras el código que usas para crear los Frames y eliminarlos de memoria, podamos ver algún error.

Saludos

MaMu
28-06-2007, 18:20:19
La excepcion que me tira es:


EOutOfResource con el mensaje "Espacio de almacenamiento insuficiente para precesar este comenado"


La rutina afectada, en la que se prucude el error es:


if PageControl2.TabIndex=1
then begin
Timer1.Enabled:=True;
Timer2.Enabled:=False;
TheTop:=0;
h:=0; //horizontal
Cant:=Lista.Count;
m:=0; //seleccionados
try
for g:=0 to Lista.Count-1 do
begin
LiberarMemoria;
Thumb:=TThumb.Create(Main.JvThumbView1);
Thumb.DoubleBuffered:=True;
Thumb.Name:='Thumb'+IntToStr(g);
//Thumb.Panel1.Caption:='# '+IntToStr(g+1);
Thumb.Panel1.Caption:=ExtractFileName(Lista.Strings[g]);
Thumb.dxCheckbox1.Checked:=ListView1.Items.Item[g].Checked;
if ListView1.Items.Item[g].Checked=True
then m:=m+1 else m:=m;
Thumb.JvThumbnail1.FileName:=Lista.Strings[g];
Thumb.JvThumbnail1.Title:=Resolucion(Lista.Strings[g]);
Thumb.Left:=((h+1)-1) * Thumb.Width;
if Thumb.Left=720
then begin
TheTop:=TheTop+Thumb.Height;
Thumb.Left:=0;
h:=0;
end;
Thumb.Top:=TheTop;
Thumb.Parent:=Main.JvThumbView1;
h:=h+1;
end;
except
end;


Los Tframes (Thumbsnails) son:


unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, dxCore, dxCheckCtrls, ExtCtrls, JvExExtCtrls, JvBaseThumbnail,
JvThumbnails;
type
TThumb = class(TFrame)
JvThumbnail1: TJvThumbnail;
Panel1: TPanel;
dxCheckbox1: TdxCheckbox;
private
procedure SetSelected(const Value: Boolean);
function GetSelected: Boolean;
{ Private declarations }
public
{ Public declarations }
property Selected:Boolean read GetSelected write SetSelected;
end;

implementation
{$R *.dfm}
{ TThumb }
function TThumb.GetSelected: Boolean;
begin
Result := dxCheckBox1.Checked;
end;

procedure TThumb.SetSelected(const Value: Boolean);
begin
dxCheckBox1.Checked := Value;
end;
end.


No se donde ni porque esta el error. Al cargar el Frame numero 230 siempre salta el error y tengo que crear 1 por cada foro, estoy probando con 356 fotos.

Saludos

Lepe
28-06-2007, 18:58:12
Un detalle:

El bucle lo haces sobre la variable "Lista" (que supongo es un TStringList) y para recorrerlo usas la variable "g", pero dentro del bucle, accedes a un ListView1 con esa misma variable "g":
Thumb.dxCheckbox1.Checked:=ListView1.Items.Item[g].Checked;
if ListView1.Items.Item[g].Checked=True

¿estan sincronizados Lista y ListView1? es decir, ¿ambos tienen el mismo número de elementos?

La excepción que da ahora, EOutOfResources si es por falta de recursos y es totalmente distinto a la anterior.

OFFTOPIC: Yo dejé de usar "LIberarMemoria", ya que producía efectos colaterales (errores de memoria varios), al dejar de usar esa rutina, se solucionaron los errores.

Saludos

MaMu
28-06-2007, 21:28:27
Los elementos estan sicronizados de hecho, el ListView se carga de la misma lista. El liberar memoria, lo agregue depues como prueba, pero con o sin el pasa exactamente lo mismo. Y ambis tienen el mismo numero de elementos.

Saludos.