Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Out of system resources (https://www.clubdelphi.com/foros/showthread.php?t=58184)

Khronos 11-07-2008 10:39:01

Out of system resources
 
Ester mensaje de error me salio por cargar imagenes de una dll. Tengo unas imagenes que cambian en el evento onEnter y onExit, pues si estos eventos se lanzan unas 12 veces o asi se cuelga el proceso explorer.exe y se pone la pantalla en blanco y me sale este mensaje de error :D:D

Me parece que es por la memoria que no la libero porque cada vez que se lanza el eventro onEnter y onExit en el taskmanager se nota como aumenta el consumo de memoria de la aplicacion.

En la dll tengo imagenes como archivos de recursos y dentro de la dll tengo una funcion para extraer todas las imagenes:

Código Delphi [-]
//Esta seria la dll
type
    PHXBitmap = record
      phxPlay, phxPlayMove, phxPlayClick, phxPause, phxPauseMove, phxPauseClick, phxPrevious,
      phxPreviousMove, phxPreviousClick, phxNext, phxNextMove, phxNextClick, phxStop, phxStopMove,
      phxStopClick, phxOpen, phxOpenMove, phxOpenClick: HBITMAP;
    end;

  function GetImages : PHXBitmap; stdcall; export;

exports
  GetImages;

implementation

function GetImages : PHXBitmap;
var
  DllHandle: THandle;
begin
  DllHandle := LoadLibrary('.\phxres\phxres.dll');
  if DllHandle <> 0 then begin
    try
         result.phxPlay:=   LoadBitmap(DllHandle, 'Play');
         result.phxPlayMove:=   LoadBitmap(DllHandle, 'PlayMove');
         result.phxPlayClick:=   LoadBitmap(DllHandle, 'PlayClick');
         result.phxPause:=   LoadBitmap(DllHandle, 'Pause');
         result.phxPauseMove:=   LoadBitmap(DllHandle, 'PauseMove');
         result.phxPauseClick:=   LoadBitmap(DllHandle, 'PauseClick');
         result.phxStop:=   LoadBitmap(DllHandle, 'Stop');
         result.phxStopMove:=   LoadBitmap(DllHandle, 'StopMove');
         result.phxStopClick:=   LoadBitmap(DllHandle, 'StopClick');
         result.phxNext:=   LoadBitmap(DllHandle, 'Next');
         result.phxNextMove:=   LoadBitmap(DllHandle, 'NextMove');
         result.phxNextClick:=   LoadBitmap(DllHandle, 'NextClick');
         result.phxPrevious:=   LoadBitmap(DllHandle, 'Previous');
         result.phxPreviousMove:=   LoadBitmap(DllHandle, 'PreviousMove');
         result.phxPreviousClick:=   LoadBitmap(DllHandle, 'PreviousClick');
         result.phxOpen:=   LoadBitmap(DllHandle, 'Open');
         result.phxOpenMove:=   LoadBitmap(DllHandle, 'OpenMove');
         result.phxOpenClick:=   LoadBitmap(DllHandle, 'OpenClick');
    finally
    end;
  end
  else begin

  end;
end;

Y aqui la llamada...
Código Delphi [-]
procedure TFMain.StopMouseEnter(Sender: TObject);
begin
Stop.Picture.Bitmap.Handle:= GetImages.phxStopMove;
end;

Espero que me puedan ayudar.. Salu2

defcon1_es 11-07-2008 11:20:25

Debes liberar la memoria asignada a la dll
 
Hola. Debes liberar la memoria asignada a la dll.

Código Delphi [-]
function GetImages : PHXBitmap;
var
  DllHandle: THandle;
begin
  DllHandle := LoadLibrary('.\phxres\phxres.dll');
  if DllHandle <> 0 then begin
    try
         result.phxPlay:=   LoadBitmap(DllHandle, 'Play');
         result.phxPlayMove:=   LoadBitmap(DllHandle, 'PlayMove');
         result.phxPlayClick:=   LoadBitmap(DllHandle, 'PlayClick');
         result.phxPause:=   LoadBitmap(DllHandle, 'Pause');
         result.phxPauseMove:=   LoadBitmap(DllHandle, 'PauseMove');
         result.phxPauseClick:=   LoadBitmap(DllHandle, 'PauseClick');
         result.phxStop:=   LoadBitmap(DllHandle, 'Stop');
         result.phxStopMove:=   LoadBitmap(DllHandle, 'StopMove');
         result.phxStopClick:=   LoadBitmap(DllHandle, 'StopClick');
         result.phxNext:=   LoadBitmap(DllHandle, 'Next');
         result.phxNextMove:=   LoadBitmap(DllHandle, 'NextMove');
         result.phxNextClick:=   LoadBitmap(DllHandle, 'NextClick');
         result.phxPrevious:=   LoadBitmap(DllHandle, 'Previous');
         result.phxPreviousMove:=   LoadBitmap(DllHandle, 'PreviousMove');
         result.phxPreviousClick:=   LoadBitmap(DllHandle, 'PreviousClick');
         result.phxOpen:=   LoadBitmap(DllHandle, 'Open');
         result.phxOpenMove:=   LoadBitmap(DllHandle, 'OpenMove');
         result.phxOpenClick:=   LoadBitmap(DllHandle, 'OpenClick');
    finally
      FreeLibrary(DllHandle);
    end;
  end
  else begin

  end;
end;

Khronos 11-07-2008 11:33:18

Gracias por responder pero me sigue dando error.. Hice una captura del error:

http://www.cuelgalo.com/viewer.php?i...37_Captura.JPG

coso 11-07-2008 12:13:34

Hola, debes liberar los bitmaps al rellamar otra vez al event. Los estas reasignando dejando la memoria anterior bloqueada.

Código Delphi [-]

function FreeImages (ph : PHXBitmap) : boolean;
begin
        result := true;
        try with ph do
            if phxPlay <> nil then phxPlay.Free;
            if  Assigned(phxPlayMove) then phxPlayMove.Free;
             ...
        except
        result := false;
        end;
end;

function GetImages : PHXBitmap;
var
  DllHandle: THandle;
begin
  DllHandle := LoadLibrary('.\phxres\phxres.dll');
  if DllHandle <> 0 then begin
    try
         result.phxPlay:=   LoadBitmap(DllHandle, 'Play');
         result.phxPlayMove:=   LoadBitmap(DllHandle, 'PlayMove');
         result.phxPlayClick:=   LoadBitmap(DllHandle, 'PlayClick');
  ...

  end;
end;

y en el codigo del event

Código Delphi [-]
begin
            ...
            FreeImages(PHX);
            PHX := GetImages;      
            ...
end;

Khronos 11-07-2008 12:31:40

Gracias por responder pero el método HBITMAP.free no existe.. La funcion esa la hice para hacerlo más fácil pero supongo que tendré que hacer una función para cada imagen :(

Salu2

coso 11-07-2008 12:36:53

Aunque hagas una funcion para cada imagen, seguiras teniendo que liberar los bitmaps anteriormente cargados... si no existe el metodo free, mira a ver si hay alguno equivalente como destroy o, si no, implementarlo tu (freemem(HBITMAP)). Si HBitmap es un handle a un bitmap, en algun lugar de memoria, igualmente, se deben guardar los datos de ese bitmap. Yo de ti revisaria bien la clase PHXBitmap y la de sus componentes. saludos.

coso 11-07-2008 12:52:53

estaba revisando otra vez el codigo. Es extraño q con liberar el handle de la dll no te funcione...y otra cosa: es necesaria cargar esta dll cada vez q requieres una imagen?

Khronos 11-07-2008 12:54:20

La clase PhxBitmap la defino yo en la dll.. HBITMAP equivale a cardinal.

Código Delphi [-]
type
    PHXBitmap = record
      phxPlay, phxPlayMove, phxPlayClick, phxPause, phxPauseMove, phxPauseClick, phxPrevious,
      phxPreviousMove, phxPreviousClick, phxNext, phxNextMove, phxNextClick, phxStop, phxStopMove,
      phxStopClick, phxOpen, phxOpenMove, phxOpenClick: HBITMAP;
    end;

Mi aplicación ya tiene varias dll y para no hacer el ejecutable muy grande hice esta dll para almacenar las imagenes. Tengo varios botones, y cada uno de esos botones tiene 3 bitmaps posibles: normal, con foco y al hacer click... manejando los eventos onMouseEnter, onMouseExit, onMouseUp ...
Son unos 100kb en imagenes y prefiero tenerlas aparte, no en el ejecutable.

Salu2 y gracias


La franja horaria es GMT +2. Ahora son las 04:44:51.

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