none
Mostrar ventana de espera mientras se ejecuta un proceso RRS feed

  • Pregunta

  •       Como podría hacer un mensaje de espera mientras se ejecuta un proceso que tarda 5 a 7 segundos?? Podría hacer eso con MessageBox...??

          La idea es cuando se ejecuta el proceso que muestre "Favor aguarde un momento" y luego al terminar el proceso que cierre la ventana.. Legue a hacer esto utilizando otro form pero tengo que manejar los hilos y es un poco complejo esa parte.

          Si tienen alguna idea les voy agradecer.

    BEMO-Paraguay

    martes, 6 de enero de 2015 19:12

Todas las respuestas

  • Bader,

    Cuando trabajas con windows form y realizas trabajos en segundo plano la manera de informar al usuario que hay algo en proceso y que tiene un tiempo de duración es a través  de un control ProgressBar. ¿Has evaluado su uso?. Además de ello cambiarás el puntero del mouse para mostrar que hay un proceso en ejecución.

    Ahora, entiendo además que ese proceso debería deshabilitar los campos de tu formulario para que no se haga ningún cambio. ¿hay algún problema allí?.

    Si la solución propuesta atendió su consulta no olvide marcarla como respuesta.


    Willams Morales P.
    Arequipa - Perú

    martes, 6 de enero de 2015 19:19
  •           Que tal Willams, llegue a realizar ese en otro form.. Actualmente me aparece procesando datos con un ProgressBar. No  tengo problema esa parte, mi consulta es si puedo hacer eso mismo pero directamente con el MessageBox...

              Tengo bien  solucionado la parte de los hilos al menos cuando me muestra otra pantalla encima de otra.

               Seria factible eso con un MessageBox ??  de tal forma creo una funcion reutilizandola.

    BEMO-Paraguay

    martes, 6 de enero de 2015 19:35
  • Un MessageBox? Sin botones? o con botones desabilitados? para que sólo puedas mostrar el mensaje?. No se si eso sea factible.
    martes, 6 de enero de 2015 19:44
  • Si es por simplicidad del código creo que la mejor opción es la de un formulario diferente como lo estabas planteando. Lo que no sé es para qué tienes que manejar diferentes hilos, simplemente necesitarías mostrar el nuevo formulario como modal y que sea éste formulario el que se encargue de lanzar el proceso, actualizar la barra de progreso y cerrarse al finalizar.

    martes, 6 de enero de 2015 19:49
  • El shell de windows tiene una caja de diálogo especialmente diseñada para ese propósito. El MessageBox, que también es un recurso del shell, requiere la interacción del usuario.

    Si usas un ProgressDialog, que de eso hablo, no necesitas manejar ningún hilo (como todo modal en windows,  ejecuta en su propio hilo, en su propio contexto manejado por el shell).

    Creas, inicializas y lanzas el PD, lanzas tu rutina, y cuando este acaba, cierras el PD.

    Busca progress dialog net, y seguramente encontrarás un wrapper para esta caja.

    Es la caja que muestra el explorer, por ejemplo, cuando copias gran cantidad de archivos.

    La clave de tu problema es poder cerrar la caja, cuando la rutina acaba, sin la intervención del usuario.


    martes, 6 de enero de 2015 20:20
  • La opción de Walter Miguel es buena.  Por ahí me apareció un wrapper llamado IProgressDialog .net en CodeProject.  Parece un buen wrapper.

    Pero en fin, al tema:  Si necesita hacer un trabajo de 5 a 7 segundos, no sería mucho problema NO usar un hilo adicional, pero tampoco es malo.  Estrictamente hablando lo correcto es el hilo nuevo, ciertamente porque si se usa el hilo de la interfase gráfica entonces durante esos 5 a 7 segundos la interfase gráfica no responderá a ninguna interacción.  Como usted busca solicitar al usuario que espere, pues tal vez esto no es tan gravísimo como en otros casos, máxime que el tiempo es corto.

    Para responder a su pregunta:  No puede hacerse con MessageBox porque 1. tiene botones, 2. el hilo que lo llama queda congelado así que no puede correr más código a menos que el usuario interactúe cerrándolo.  Sí, hay formas.  Por ejemplo crear otro hilo que lo cierre cuando uno quiera, pero no es lo correcto en prácticamente ninguna situación.  Si va a hacer hilo aparte, mejor hacerlo como se debe.

    Si yo estuviera en su caso y no quisiera usar el ProgressDialog de Windows, entonces crearía un hilo que haga el trabajo que tarda esos 5-7 segundos y mientras muestro un nuevo formulario no modal encima del actual (que se deshabilita) con el mensaje de espera.  El hilo que hace el trabajo tendría una referencia a este formulario de forma que cuando termine el trabajo simplemente invoque el método Close() del formulario.  El evento FormClosing() tendría código para rehabilitar el formulario principal.

    //Este código iniciaría el trabajo y mostraría el mensaje de espera.
    fmEspere f = new fmEspere();
    f.FormularioPadre = this;
    f.Show();
    this.Enabled = false;
    Thread t = new Thread(ElMetodoQueHaceElTrabajo);
    t.Start(f);
    
    
    
    //Esta sería la función que hace el trabajo en un nuevo hilo.
    private static void ElMetodoQueHaceElTrabajo(object dato)
    {
        Form f = dato as Form;
        //Hacemos lo que hay que hacer
        ...
        //Cerramos el formulario.
        Action c = f.Close;
        f.Invoke(c);
    }
    
    
    
    //Y esto sería en el formulario de espera.
    public Form FormularioPadre { get; set; }
    
    public void OnFormClosing(object sender, FormClosingEventArgs e)
    {
        FormularioPadre.Enabled = true;
    }


    Jose R. MCP
    Code Samples

    miércoles, 7 de enero de 2015 3:18
    Moderador
  •       Muchas gracias por la ayuda a todos. Voy a tener en cuenta los consejos que me dieron.

    BEMO-Paraguay

    miércoles, 7 de enero de 2015 11:52