Ver la Versión Completa : Liberar Memoria
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
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
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
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
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
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.
vBulletin v3.6.8, Derechos ©2000-2024, Jelsoft Enterprises Ltd.