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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-07-2008
Khronos Khronos is offline
Miembro
 
Registrado: abr 2007
Posts: 298
Poder: 18
Khronos Va por buen camino
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

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
Responder Con Cita
  #2  
Antiguo 11-07-2008
Avatar de defcon1_es
defcon1_es defcon1_es is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuenca - España
Posts: 533
Poder: 21
defcon1_es Va por buen camino
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;
__________________
Progress Openedge
https://abevoelker.com/progress_open...dered_harmful/


Delphi forever...
Responder Con Cita
  #3  
Antiguo 11-07-2008
Khronos Khronos is offline
Miembro
 
Registrado: abr 2007
Posts: 298
Poder: 18
Khronos Va por buen camino
Gracias por responder pero me sigue dando error.. Hice una captura del error:

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

Última edición por Khronos fecha: 11-07-2008 a las 11:35:44.
Responder Con Cita
  #4  
Antiguo 11-07-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
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;

Última edición por coso fecha: 11-07-2008 a las 12:31:52.
Responder Con Cita
  #5  
Antiguo 11-07-2008
Khronos Khronos is offline
Miembro
 
Registrado: abr 2007
Posts: 298
Poder: 18
Khronos Va por buen camino
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
Responder Con Cita
  #6  
Antiguo 11-07-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
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.

Última edición por coso fecha: 11-07-2008 a las 12:52:13.
Responder Con Cita
  #7  
Antiguo 11-07-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
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?
Responder Con Cita
  #8  
Antiguo 11-07-2008
Khronos Khronos is offline
Miembro
 
Registrado: abr 2007
Posts: 298
Poder: 18
Khronos Va por buen camino
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

Última edición por Khronos fecha: 11-07-2008 a las 12:57:29.
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Out of system resources johurgi Varios 5 04-06-2008 15:54:34
Error RLINK32: Too Many Resources To handle mancurnino Varios 16 21-03-2008 20:30:04
System Gym novato03 Varios 7 22-10-2007 22:07:06
Sólo para expertos: "Error reading iError.Picture.Data:Out of system resources" sami76 Varios 2 04-10-2007 13:53:31
Delphi resources Delfino Noticias 0 20-02-2007 10:57:08


La franja horaria es GMT +2. Ahora son las 09:41:32.


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
Copyright 1996-2007 Club Delphi