Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Liberar Memoria (https://www.clubdelphi.com/foros/showthread.php?t=45288)

MaMu 28-06-2007 08:23:02

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 link pueda ayudarte.

Saludos

MaMu 28-06-2007 09:33:48

Cita:

Empezado por Bicho
Hola mamu,

quizá éste 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:

Código Delphi [-]
EOutOfResource con el mensaje "Espacio de almacenamiento insuficiente para precesar este comenado"

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

Código Delphi [-]
 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:

Código Delphi [-]
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":
Código Delphi [-]
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.


La franja horaria es GMT +2. Ahora son las 12:25:15.

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