none
Problema con Thread y formulario con ProgressBar RRS feed

  • Pregunta

  • ¡Hola gente! Estoy teniendo un problema con un Thread, y es el siguiente: tras instalarse, mi aplicación abre un formulario para la creación de la Base de Datos. La misma la creo mediante la lectura de un archivo que contiene el script. Mientras se lee y ejecuta el script quisiera abrir un formulario que tenga un progressbar que diga que se debe esperar... Lo hice de la siguiente manera, y creo que debería funcionar, pero no se por qué no lo hace. Quizá estoy omitiendo algo y puedan ayudarme:

     

    Desde aquí llamo al nuevo thread:

     

    //Nuevo thread para el progressbar
    frmProgreso oProgreso = new frmProgreso();
    
    System.Threading.Thread t = new System.Threading.Thread(progreso);
    t.Start();
    Application.DoEvents();
    
    ControlDeAcceso.Clases.FuncionesCompartidas.CrearDB(txtUsuario.Text, txtContrasenia.Text, cmbServidor.Text, txtPuerto.Text);
    
    //Para cerrar el progressbar
    oProgreso.Estado = true;
    

    El método progreso:

     

    private void progreso()
    {
    	oProgreso.prgAltas.Style = ProgressBarStyle.Marquee;
    	oProgreso.Estado = true;
    	oProgreso.Show();
    	oProgreso.BringToFront();
    
    	while (oProgreso.Estado.Equals(false))
    	{
    		Application.DoEvents();
    		System.Threading.Thread.Sleep(100);
    	}
    	oProgreso.Close();
    	oProgreso.Dispose();
    }
    

     

    Y la propiedad en el formulario del progressbar es la siguiente:

     

    	private bool estado;
    	public bool Estado
    	{
    		get { return estado; }
    		set { estado = value; }
    	}
    
    

     

     


    Gabriela
    viernes, 14 de enero de 2011 1:34

Respuestas

Todas las respuestas

  • Hola buenas, te pongo un ejemplo de lo que haria yo (mi opinion).

    Al hacer click en el botón, o lo que sea, crearía el hilo. Y mostraria el form del la barra de progreso.

    En el metodo que procesa la info, pues llamaria al metodo que sea necesario y al final llamaria a un metodo para cerrar el form de la barra de progreso utilizando un delegado.

    Bueno no creo que me haya explicado demasiado bien, así que te dejo un ejemplo.

    Cualquier cosa, dilo.

    internal delegate void Delegado(); // delegado para poder tener acceso al form de la barra de progreso desde un hilo diferente al que se creó-
        private Form2 barraprogreso; // Form de la barra de progreso
        System.Threading.Thread hilo; // Hilo para crear en este caso la DB y cerrar el form de la barra de progreso cuando haya terminado
        
        private void button1_Click(object sender, EventArgs e)
        {
          hilo = new System.Threading.Thread(new System.Threading.ThreadStart(this.progreso));
          barraprogreso = new Form2();
          barraprogreso.Show();
          hilo.Start();
        }
    
        private void progreso()
        {
          //Aqui proceso
          System.Threading.Thread.Sleep(2000); // Detener el hilo actual para simular tiempo que tarda en ejecutarse el metodo
          Cerrar();
        }
    
        private void Cerrar()
        {
          if (barraprogreso.InvokeRequired)
          {
            Delegado del = new Delegado(Cerrar);
            barraprogreso.Invoke(del);
          }
          else
            barraprogreso.Close();
        }
    

    viernes, 14 de enero de 2011 2:07
  • Acabo de encontrar la respuesta a mi problema... en el método progreso, tengo qeu inicializarlo en false no en true.......
    Gabriela
    viernes, 14 de enero de 2011 3:26
  • Hola Altrox! no me queda claro dónde debe ir cada cosa... Cerrar y Delegado van en el form del progressbar y el resto de cosas desde donde se llame al thread?
    Gabriela
    viernes, 14 de enero de 2011 3:28
  • Hola buenas, Cerrar y Delegado van el form principal, ya que en éste (en el principal) muestras el form que contiene la barra de progreso.

    Lo que hice fue:

    - Crear el Form2 que contiene únicamente la barra de progreso con sus propiedades ya definidas.

    - Luego, al pulsar el botón se crea el hilo y el Form2, luego se muestra el Form2 y se ejecuta el hilo.

    - En el metodo que ejecuta el hilo hago una parada (para "simular" el tiempo que tarda el metodo o metodos) y al final de todo llamo a Cerrar, que, comprueba si Form2 necesita ser invocado ya que se quiere acceder a el desde otro hilo al que se creó.

     

    Saludos!

    viernes, 14 de enero de 2011 3:46