• Viernes 1 de Noviembre de 2024, 15:28

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Temas - kolroff o_O)

Páginas: [1]
1
C# / Hilos e Imagelist
« en: Jueves 28 de Octubre de 2010, 09:44 »
Hola a tod@s!!!

estoy haciendo una aplicación en C# la cual es un muestrario de productos (imagen y descripción), debo mostrar gran cantidad de productos (unos 500) en el menor tiempo posible. Para ello decidí cargar todas las imágenes de los productos en un ImageList para manejarlos más rápidamente ( a lo mejor es una locura lo que estoy diciendo, porque puede que consuma demasiados recursos).

Para no tener que esperar a que carguen todas las imágenes en el ImageList, decidí lanzar esa tarea en un hilo a parte, así la ejecución del programa principal no se vería bloqueda.

Pues bien, mi problema es el siguente:

 - CASO 1: si comienzo a visualizar los productos desde el programa principal (hilo pricipal) antes de que el hilo secundario haya terminado de cargarlos todos en el ImageList, empiezo a observar que no ha cargado los productos en el orden correcto (según los va recuperando de la BD), hay algunos productos intercalados alterando el orden natural de la secuencia. Además compruebo que en cada ejecucíon el orden varía, no es siemrpe el mismo.

 - CASO 2: si espero a que el hilo secundario termine de cargar todos los productos en el ImageList antes de empezar a mostrarlos en el hilo principal, una vez finalizada la carga, el hilo principal se bloquea (de hecho casi todo el ordenador se bloquea), si lo dejo un rato vuelve a responder toscamente, puede ser debido que son muchas imágenes las que manipula. Sin embargo en el CASO 1 el programa NO SE BLOQUEA y está gestionando el mismo volumen de datos.

Dejo el código a continuación


Código: C#
  1. //Clase secundaria que recupera las imágenes de la BD
  2. //y las almacena en un ImageList
  3. class RellenarImagenes
  4.     {
  5.         private ImageList im;
  6.         //Constructor
  7.         public RellenarImagenes()
  8.         {
  9.             im = new ImageList();
  10.             this.im.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit;
  11.             this.im.ImageSize = new System.Drawing.Size(256, 150);
  12.             this.im.TransparentColor = System.Drawing.Color.Transparent;
  13.         }
  14.          //Devuelve el ImageList
  15.          public ImageList devuelveImageList()
  16.         {
  17.             return this.im;
  18.         }
  19.        
  20.         //Rellena el ImageList con las fotos de los productos de la BD
  21.         public void rellenaImageList()
  22.         {
  23.            
  24.             String strSQL = "SELECT * FROM xxxImagenes";
  25.             OleDbConnection cnn = new OleDbConnection();
  26.             cnn.ConnectionString = cadenaConexion;
  27.             cnn.Open();
  28.             OleDbCommand sentencia = new OleDbCommand(strSQL, cnn);
  29.             OleDbDataReader objReader = sentencia.ExecuteReader();
  30.  
  31.             while (objReader.Read())
  32.             {
  33.                 Image imagen = new Bitmap(objReader[1].ToString());
  34.                 im.Images.Add(imagen);
  35.             }
  36.            
  37.         }
  38.     }//Fin Clase RellenarImagenes
  39.  
  40.  
  41. //Este metodo se encuentra dentro de la clase principal, es el que crea el
  42. //hilo secundario para llamar al metodo de rescatar las imagenes de la BD y
  43. //meterlas en el el ImageList
  44.         private void cargaImageList()
  45.         {
  46.             //Instanciamos la clase
  47.             RellenarImagenes ri = new RellenarImagenes();
  48.             //Asignamos el ImageList devuelto a el atributo ImageList de la
  49.             //clase principal.
  50.             this.imageList1 = ri.devuelveImageList();
  51.             //Lanzamos el nuevo hilo.
  52.             Thread th = new Thread(new ThreadStart(ri.rellenaImageList));
  53.             th.Start();
  54.         }
  55.  


No se que hacer para que me muestre las imagenes en el orden correcto, a lo mejor eso de cargar todas las imagenes de golpe en un ImageList es una mala soloción.

Muchas Gracias por anticipado, a lo mejor es un poco lioso, si algo no entienden, no duden en preguntar.

Páginas: [1]