Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-01-2023
Wellnic Wellnic is offline
Miembro
 
Registrado: mar 2007
Posts: 68
Poder: 18
Wellnic Va por buen camino
Question Array of TImage

Hola, qué hay?

En el momento de eliminar completamente las imágenes de un Array of TImage (dinámico) insertadas en un ScrollBox, ¿es suficiente con eliminar dicho ScrollBox o es conveniente eliminar cada imagen individualmente (For i:= High(fotos) DownTo Low(fotos) Do fotos[i].Free)?

Es que he hecho las dos versiones y no sé con cual quedarme
Responder Con Cita
  #2  
Antiguo 16-01-2023
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Al liberar un array normal no se liberan las cosas a las que apunta... por lo tanto entiendo que deberías liberar cada imagen.
Para comprobarlo puedes hacer un bucle que carge y elimine el ScrollBox sin la parte de la liberación de memoria de los TImage asociados y vas mirando cuanta memoria consume windows. Si sube, ya sabes la respuesta.
Responder Con Cita
  #3  
Antiguo 16-01-2023
Wellnic Wellnic is offline
Miembro
 
Registrado: mar 2007
Posts: 68
Poder: 18
Wellnic Va por buen camino
Lo malo es que un ordenador con 16 GB de RAM ni se iba a enterar ... y encima las imágenes cargadas son en realidad miniaturas no se nota aunque cargues cientos... y en este caso es significativamente lento eliminarlas una a una.
Responder Con Cita
  #4  
Antiguo 16-01-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
En teoría no se libera la memoria de las imágenes, ya que estas han sido creadas antes, y asignada después al scrollbox.
Yo las eliminaría, no puede ser lento como dices, debe ser algo instantáneo.

Y lo de que tiene 16 Gb no puede ser ninguna excusa

Última edición por Casimiro Notevi fecha: 16-01-2023 a las 18:44:15.
Responder Con Cita
  #5  
Antiguo 16-01-2023
Wellnic Wellnic is offline
Miembro
 
Registrado: mar 2007
Posts: 68
Poder: 18
Wellnic Va por buen camino
Lento sí que es, tarda sus buenos cinco segundos en deshacerse de unos pocos cientos de miniaturas... claro que solo va a un tercio de la velocidad del microprocesador, lógicamente... En cuanto pueda, hago las pruebas que me sugiere Duilioisola en una máquina virtual...
Responder Con Cita
  #6  
Antiguo 16-01-2023
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
También puedes cargar imágenes grandes en formato BMP a todo color.
Con el Paint crea un cuadrado blanco de 1000x1000 y guárdalo en formato BMP de 24 bits.
La imagen pesará 2.86MB.
En la carga de miniaturas fuérzalo a cargar esta imagen.
Responder Con Cita
  #7  
Antiguo 17-01-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Wellnic Ver Mensaje
Lento sí que es, tarda sus buenos cinco segundos en deshacerse de unos pocos cientos de miniaturas... claro que solo va a un tercio de la velocidad del microprocesador, lógicamente... En cuanto pueda, hago las pruebas que me sugiere Duilioisola en una máquina virtual...
Tendríamos que ver tu código, liberar miles de imágenes debe ser casi instantáneo.
¿Por qué tienes que hacer las pruebas en una máquina virtual?
Responder Con Cita
  #8  
Antiguo 17-01-2023
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
¡Hola, Wellnic!

Como alternativa al Array, puedes hacer uso de la clase TOBjectList<T>

Cita:
Empezado por Embarcadero
TObjectList es un TList con la capacidad de liberar automáticamente entradas de objetos cuando se eliminan de la lista...
Para prueba usé un archivo de 91 Kb, la carga de las imágenes fue de 1.4 segundos y al liberarlas tomó 23 milisegundos

Código Delphi [-]
uses
  System.Generics.Collections;
const
  C_TOTAL = 1000;
var
  i, idx: integer;
  List: TObjectList< TImage >;
begin
  { Crea la lista }
  { La propiedad OwnsObjects está establecida como true por defecto -- La lista liberará los objetos automáticamente. }
  List := TObjectList< TImage >.Create();

  { Se agregan los objetos. }
  for i := 0 to C_TOTAL - 1 do
  begin
    idx := List.Add(TImage.Create(nil));
    List[idx].Picture.LoadFromFile('Image1.bmp')
  end;

  { Se libera un índice en particular } 
  List.Delete(0);

  { Se libera la lista completa } 
  List.Clear;

  { Destruir completamente la lista -- Si no se han liberado objetos de la lista, se liberan en este momento. }
  List.Free;
end.
__________________
Buena caza y buen remar... http://mivaler.blogspot.com

Última edición por movorack fecha: 17-01-2023 a las 13:52:27.
Responder Con Cita
  #9  
Antiguo 17-01-2023
Wellnic Wellnic is offline
Miembro
 
Registrado: mar 2007
Posts: 68
Poder: 18
Wellnic Va por buen camino
Wink

Cita:
Empezado por Casimiro Notevi Ver Mensaje
Tendríamos que ver tu código, liberar miles de imágenes debe ser casi instantáneo.
¿Por qué tienes que hacer las pruebas en una máquina virtual?
A qué código te refieres? El de liberar imágenes lo puse al principio, no puede ser más simple:
Código Delphi [-]
  For i:= High(fotos) DownTo Low(fotos) Do
    Begin
    fotos[i].Free;
    IDs[i].Free;
    End;

Y las creo así:
Código Delphi [-]
SetLength(fotos, mp+ 1);
fotos[mp]:= TImage.Create(ScrollBox1);
fotos[mp].SetBounds(5, (mp* 174)+ 5, 264, 168);
fotos[mp].Parent:= SrollBox1;
...
...

    SetLength(IDs, mp+ 1);
    IDs[mp]:= TEdit.Create(SrollBox1);
    IDs[mp].SetBounds(274, mosaicos[mp].Top+ 70, 1030, 46);
    IDs[mp].parent:= SrollBox1;
...
...
Nada del otro jueves
Como ves, además de las fotos, creo TEdit asociados, que muestran un ID para cada foto. ¿Serán los que ralentizan el borrado? (Lo curioso es que, cuando se crean muchos de esos elementos, los Tedit centrales y finales no suelen aparecer...)

Si quieres pongo el procedimiento completo, pero no creo que te fuera a aclarar mucho más...
Responder Con Cita
  #10  
Antiguo 17-01-2023
Wellnic Wellnic is offline
Miembro
 
Registrado: mar 2007
Posts: 68
Poder: 18
Wellnic Va por buen camino
Cita:
Empezado por movorack Ver Mensaje
¡Hola, Wellnic!

Como alternativa al Array, puedes hacer uso de la clase TOBjectList<T>



Para prueba usé un archivo de 91 Kb, la carga de las imágenes fue de 1.4 segundos y al liberarlas tomó 23 milisegundos

Código Delphi [-]
uses
  System.Generics.Collections;
const
  C_TOTAL = 1000;
var
  i, idx: integer;
  List: TObjectList< TImage >;
begin
  { Crea la lista }
  { La propiedad OwnsObjects está establecida como true por defecto -- La lista liberará los objetos automáticamente. }
  List := TObjectList< TImage >.Create();

  { Se agregan los objetos. }
  for i := 0 to C_TOTAL - 1 do
  begin
    idx := List.Add(TImage.Create(nil));
    List[idx].Picture.LoadFromFile('Image1.bmp')
  end;

  { Se libera un índice en particular } 
  List.Delete(0);

  { Se libera la lista completa } 
  List.Clear;

  { Destruir completamente la lista -- Si no se han liberado objetos de la lista, se liberan en este momento. }
  List.Free;
end.
Le echaré un ojo, gracias...
Responder Con Cita
  #11  
Antiguo 18-01-2023
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Wellnic Ver Mensaje
Lento sí que es, tarda sus buenos cinco segundos en deshacerse de unos pocos cientos de miniaturas... claro que solo va a un tercio de la velocidad del microprocesador, lógicamente... En cuanto pueda, hago las pruebas que me sugiere Duilioisola en una máquina virtual...
Es raro, porque tal y como han comentado, para miniaturas debería ser un proceso rápido.
Otra opción podría ser crear un thread sencillo que realizara la liberación y así el programa podría continuar (habría que ver en qué momento se libera).
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #12  
Antiguo 18-01-2023
Wellnic Wellnic is offline
Miembro
 
Registrado: mar 2007
Posts: 68
Poder: 18
Wellnic Va por buen camino
Sí... se ve como la barra de desplazamiento vertical se va moviendo y distendiendo en orden inverso, hasta que todas las imágenes desaparecen. Así que se me ocurrió ocultar el ScrollBox y mostrar la interfaz principal (un Memo ) antes del proceso de borrado y (al parecer) asunto arreglado
Responder Con Cita
  #13  
Antiguo 19-01-2023
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
En esos casos se puede mirar si se puede "desactivar" el refresco visual. Dependiendo de los componentes poseen un EnebleControls/Disablecontrols o BeginUpdate/EndUpdate o algo similar. Porque seguramente la mayor parte del tiempo se está "gastando" en el refresco de la parte visual, no en la propia destrucción de las imágenes.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
Respuesta



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
Girar un Timage con respecto a otro Timage Tuvan Gráficos 1 05-11-2016 21:30:50
Problema para hacer un array a un TImage! Manuzinho OOP 5 05-02-2011 23:51:19
Mostrar cada imagen de un Array of TImage. rauros Gráficos 1 04-09-2008 17:38:55
como Hacer que un TImage siga a un Timage? j_flores3000 OOP 8 27-03-2008 18:47:50
como combinar 2 Timage en un tercer Timage JefeNet Gráficos 10 02-09-2004 16:51:35


La franja horaria es GMT +2. Ahora son las 23:51:19.


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