Blog alskare

.Net y lo que surja

WinForms. Mostrar progreso con ProgressBar

Posted by alskare en 13/01/2009

Uno de los atractivos de WinForms es que, cuando existe un procedimiento que tarda un rato en ejecutarse, se le puede ir mostrando al usuario un porcentaje aproximado de la duración que seguirá el sistema con el proceso. El control ProgressBar es una herramienta visual atractiva para realizar este tipo de acciones.

El uso de un control ProgressBar realmente es bien sencillo, puesto que tan sólo se trata de modificar un par de propiedades: Maximum, donde indicamos el valor entero máximo que admitirá el control y Value, que representará el progreso actual. Hasta aquí, todo es más o menos normal y sencillo. Un ejemplo de uso podría ser, aproximadamente el siguiente:

barraProgreso.Maximum = 100
For i As Integer = 0 To 100
    System.Threading.Thread.Sleep(500)
    barraProgreso.Value = i
Next

Uno de los problemas que surgen cuando se está ejecutando un proceso es que, si por ejemplo, el usuario minimiza la ventana de la aplicación o la coloca en segundo plano, nos encontramos con que, al situar la ventana de la aplicación de nuevo en un primer plano, la barra de progreso no sigue actualizándose, puesto que el proceso que se está ejecutando es el “cálculo” y no los “refrescos” de pantalla.

Una posible solución a este problema se encuentra en el procedimiento System.Windows.Forms.Application.DoEvents(), el cual, según la propia ayuda de .Net:

Al ejecutar un formulario Windows Forms, crea el nuevo formulario, que espera recibir eventos y controlarlos. Cada vez que el formulario controla un evento, procesa todo el código asociado al evento. Los demás eventos esperan en la cola. Mientras el código está controlando el evento, la aplicación no responde. Por ejemplo, la ventana no se vuelve a dibujar si se arrastra otra ventana encima de ella.

Viendo esto, tan sólo se trata de realizar una pequeña modificación en la rutina de presentación del progreso:

Private Sub PulsadoClick(ByVal sender As Object, ByVal e As EventArgs)
    barraProgreso.Maximum = 100
    For i As Integer = 0 To 100
        System.Threading.Thread.Sleep(500)
        barraProgreso.Value = i

        Application.DoEvents()
    Next
End Sub

Debo reconocer que antes de ver algo tan sencillo, como es habitual en mí, he pasado por hacer alguna cosa con el control BackgroundWorker, para que el proceso de presentación del progreso se ejecutase en segundo plano. No se me ha ocurrido mirar el rendimiento de ambos, pero es de suponer que la ejecución de tareas en segundo plano provoca un mayor consumo de recursos y, en consecuencia, un menor rendimiento.

 

Etiquetas de Technorati: ,

3 comentarios to “WinForms. Mostrar progreso con ProgressBar”

  1. alskare said

    La verdad es que se agradecen los comentarios, sobre todo, cuando se trata de transmitir positivismo. Es una señal que indica que no todo el trabajo que se realiza es inútil.
    Gracias, de verdad.

  2. Martin said

    xevere la aportacion amioo gracias me resolvistes mi problemaaa
    XD

  3. Alejandro said

    Muchas gracias, muy simple, muy util y muy bien explicado.

Sorry, the comment form is closed at this time.

 
A %d blogueros les gusta esto: