elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  (HILOS) Pantalla espera c#
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: (HILOS) Pantalla espera c#  (Leído 15,082 veces)
neidox

Desconectado Desconectado

Mensajes: 3


Ver Perfil
(HILOS) Pantalla espera c#
« 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

        }


En línea

MANULOMM


Desconectado Desconectado

Mensajes: 559


Erepublik.com


Ver Perfil
Re: (HILOS) Pantalla espera c#
« Respuesta #1 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


En línea


MANULOMM


Desconectado Desconectado

Mensajes: 559


Erepublik.com


Ver Perfil
Re: (HILOS) Pantalla espera c#
« Respuesta #2 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
En línea


[D4N93R]
Wiki

Desconectado Desconectado

Mensajes: 1.646


My software never has bugs. Its just features!


Ver Perfil WWW
Re: (HILOS) Pantalla espera c#
« Respuesta #3 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
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines