Ver Mensaje Individual
  #1 (permalink)  
Antiguo 27/10/2010, 05:39
kolroff
 
Fecha de Ingreso: octubre-2010
Mensajes: 5
Antigüedad: 14 años, 1 mes
Puntos: 0
Hilos e ImageList

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:
//Clase secundaria que recupera las imágenes de la BD
//y las almacena en un ImageList
class RellenarImagenes
    {
        private ImageList im;
        //Constructor
        public RellenarImagenes()
        {
            im = new ImageList();
            this.im.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit;
            this.im.ImageSize = new System.Drawing.Size(256, 150);
            this.im.TransparentColor = System.Drawing.Color.Transparent;
        }
         //Devuelve el ImageList
         public ImageList devuelveImageList()
        {
            return this.im;
        }
        
        //Rellena el ImageList con las fotos de los productos de la BD
        public void rellenaImageList()
        {
            
            String strSQL = "SELECT * FROM xxxImagenes";
            OleDbConnection cnn = new OleDbConnection();
            cnn.ConnectionString = cadenaConexion;
            cnn.Open();
            OleDbCommand sentencia = new OleDbCommand(strSQL, cnn);
            OleDbDataReader objReader = sentencia.ExecuteReader();

            while (objReader.Read())
            {
                Image imagen = new Bitmap(objReader[1].ToString());
                im.Images.Add(imagen);
            }
            
        }
    }//Fin Clase RellenarImagenes


//Este metodo se encuentra dentro de la clase principal, es el que crea el 
//hilo secundario para llamar al metodo de rescatar las imagenes de la BD y
//meterlas en el el ImageList
        private void cargaImageList()
        {
            //Instanciamos la clase
            RellenarImagenes ri = new RellenarImagenes();
            //Asignamos el ImageList devuelto a el atributo ImageList de la 
            //clase principal.
            this.imageList1 = ri.devuelveImageList();
            //Lanzamos el nuevo hilo.
            Thread th = new Thread(new ThreadStart(ri.rellenaImageList));
            th.Start(); 
        }

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.