Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: neidox en 19 Enero 2010, 13:57 pm



Título: (HILOS) Pantalla espera c#
Publicado por: neidox en 19 Enero 2010, 13:57 pm
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.

Código:
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

        }


Título: Re: (HILOS) Pantalla espera c#
Publicado por: MANULOMM en 22 Enero 2010, 16:32 pm
no he leido tu codigo, pero pienso que lo mejor es crear el hilo para la consulta de datos y sincronizas los dos hilos para mostrar un barrita de progeso... si eso te sirve yo podria ayudarte...

Atentamente,

Juan Manuel Lombana
Medellín - Colombia


Título: Re: (HILOS) Pantalla espera c#
Publicado por: MANULOMM en 25 Enero 2010, 23:48 pm
Te dejo un ejemplo que acabo de hacer.

Código
  1.  
  2. //Creamos el Hilo.
  3.        Thread hilo;
  4.        //Esta variable controlara el porcentaje de trabajo realizado por el hilo.
  5.        private static int valor = 0;
  6.  
  7.        public Form1()
  8.        {
  9.            InitializeComponent();
  10.            //Apuntamos el hilo al metodo que consulta los datos y hace las operaciones.
  11.            hilo = new Thread(new ThreadStart(Datos));
  12.        }
  13.  
  14.        private void btnComenzar_Click(object sender, EventArgs e)
  15.        {
  16.            //Iniciamos el hilo.
  17.            hilo.Start();
  18.        }
  19.  
  20.        public void Datos()
  21.        {
  22.            //Esta es la operacion que toma tiempo.
  23.            //Para este ejemplo un bucle con un Sleep de 0.1 segundos.
  24.            for (int i = 0; i < 50; i++)
  25.            {
  26.                //Invocamos el metodo que actualiza la barra de progreso, le pasamos como parametro el
  27.                //numero maximo de la operacion, para el caso de la bd seria el numero maximo de registros.
  28.                this.Progreso(50);
  29.                Thread.Sleep(100);
  30.  
  31.            }
  32.            MessageBox.Show("Termino el Proceso");
  33.        }
  34.  
  35.        //Este metodo actualizara la barra de progreso.
  36.        //retorna un int con el fin de utilizar el delegado generico Func.
  37.        //Pero siempre retorna 0.
  38.        public int Progreso(int Max)
  39.        {
  40.            //Hacemos la sincronizacion de hilos.
  41.            //Si no estamos en el Hilo Principal.
  42.            if (prbProgreso.Control.InvokeRequired)
  43.            {
  44.                //Invocamos el hilo principal.
  45.                Func<int,int> delegado = new Func<int,int>(Progreso);
  46.                prbProgreso.Control.Invoke(delegado,Max);
  47.            }
  48.            else
  49.            {
  50.                //Estamos en el hilo principal, actualizamos la barra de progreso y todos los
  51.                //elementos de la interfaz grafica.
  52.                valor++;
  53.                prbProgreso.Value = (valor * 100) / Max;
  54.                lblPorcentaje.Text = prbProgreso.Value.ToString() + "%";
  55.            }
  56.            return 0;
  57.        }
  58.  
  59.  

Atentamente,

Juan Manuel Lombana
Medellín - Colombia


Título: Re: (HILOS) Pantalla espera c#
Publicado por: [D4N93R] en 2 Febrero 2010, 16:57 pm
Exacto, además es mala practica cerrar un hilo abortándolo, mejor es terminando las ordenes de ejecución mediante un join.

saludos