• Miércoles 15 de Mayo de 2024, 00:20

Autor Tema:  Pantalla carga (hilos)C#  (Leído 7002 veces)

carlos_087

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Pantalla carga (hilos)C#
« en: Martes 19 de Enero de 2010, 14:25 »
0
Hola a todos! Estoy programando en C# una aplicación basada en ventanas, y tengo el siguiente problema.

Mi proceso principal, al pulsar cierto botón en el interfaz gráfico, debe leer unos datos de una base de datos (operación que tarda unos segundos). Para evitar que no se quede la ventana como "colgada" mientras realiza la operación he pensado en crear un hilo que me muestre una nueva ventana diciendo "Cargando, espere".

Hasta aquí todo bien, excepto por un pequeño detalle: algunas veces, cuando aborto el hilo que me crea la pantalla de espera, ignora esta señal de aborto y la ventana permanece en la pantalla como si nada.

Os dejo el código a ver si podeis saber que hago mal, o que otra solución podríais aportar.

Saludos.
Citar
private void.... --> A este método se le llama cuando se pulsa el botón para cargar los datos correspondientes
            this.Window.Hide();
            this.aux = new Thread(new ThreadStart(creaPantallaEspera));
            this.aux.Name = "Esperando...";
            this.aux.ApartmentState = ApartmentState.STA;
            this.aux.Start();

         PantallaRanking ranking = new PantallaRanking(this.Window); ---> Se cargan los datos de la base de datos
            this.aux.Abort(); --> Aborto el hilo

           
            ranking.Show();

El método que ejecuta el hilo (creaPantallaEspera)
private void creaPantallaEspera()
        {
            PantallaEspera espera = new PantallaEspera();--> Ventana que muestra "Cargando"
            espera.Show();
            this.aux.Join(); -->Hago que se espere a sí mismo para que no desaparezca la ventana espera

        }

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: Pantalla carga (hilos)C#
« Respuesta #1 en: Martes 19 de Enero de 2010, 19:36 »
0
No he trabajado con hilos, pero me parece que crear un hilo solamente para mostrar una ventana de "Cargando, espere" es algo excesivo.

Por otro lado, aunque dezconozco exactamente que hace tu programa, por lo poco que mencionas, me parece que mientras estas cargando tu informacion, no puedes seguir adelante con el resto de tu programa por lo que el hilo adicional en realidad es inutil. El uso de hilos es generalmente cuando en tu aplicacion tienes dos o mas procesos completamente independientes, y necesitas que se ejecuten simultaneamente para poder ahorrar tiempo, pero en tu caso, mientras no cargues tus datos, no puedes continuar, por lo que no hay ahorro de tiempo.

En todo caso, si lo que quieres es solo una ventana de "Cargando, Espere" o quizas una barra de progreso, deberias usar en su lugar Delegados Y Eventos. Entonces, cuando comiences a cargar la base de datos, creas la pantalla de espera, y cuando se genera el evento de carga completa, entonces cierras/destruyes la ventana de espera. Todo sin necesidad de hilos. El mejor ejemplo de delegados y eventos lo tienes con los Controles Comunes de System.Windows.Forms. Cuando tu añades un Button por ejemplo, creas el evento click. Tu programa no se detiene mientras espera a que pulses clck en el boton, sino que sigue adelante y puedes hacer otra cosa dentro de tu mismo formulario. Pero gracias a los eventos, cuando tu haces click en el boton, tu programa deja cualquier cosa que este haciendo y va al codigo de tu evento click.

Resumiendo, ese seria mi consejo. Busca informacion sobre delegados y eventos, y utilizalos en lugar de hilos.

Saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

carlos_087

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: Pantalla carga (hilos)C#
« Respuesta #2 en: Miércoles 20 de Enero de 2010, 00:25 »
0
Muchas gracias ProfesorX, he pensado en esa solución pero tengo varias dudas.

Tal y como usted me comenta (perdón por no haberme expresado bien) mientras no cargue los datos, no puedo continuar con mi programa. Una vez aclarado esto, tengo las siguientes dudas en cuanto a la solución que usted me da.
Si desde el proceso principal creo una ventana que me muestre "Cargando, tenga paciencia", con la demora del tiempo, se pone el típico mensajito de Window "No responde". Esto se debe a que el proceso que crea la ventana, está ocupado realizando la carga de la base de datos y por tanto no puede llevar a cabo a la vez la gestión de la ventana. De ahí que pense en una solución basada en hilos.

No se si es eso lo que usted me proponía. Si no lo es, le estaría agradecidísimo si me ayuda con la explicación o algún ejemplo.

Muchas Gracias.
PD: Cualquier otra solución, será muy bien recibida

gerardoskype

  • Miembro activo
  • **
  • Mensajes: 50
  • Nacionalidad: mx
    • Ver Perfil
Re: Pantalla carga (hilos)C#
« Respuesta #3 en: Miércoles 20 de Enero de 2010, 17:17 »
0
Creo que si no puedes manipular los datos, no te sirve un hilo.
Mas bien como comenta ProfesorX, seria trabajo de "Delegados".

Mientras se cargan los datos se abre otro form de tamaño moderado, donde comenta que deberas esperar y bla bla bla.

una vez cargada la info en el primero, el delegado hace de puente para cerrar el segundo form.

en teoria si se puede, aunque yo jamas lo a intentado. solo te doy la idea