none
Velocidad de ProgressBar con propiedad Style = Marquee RRS feed

  • Pregunta

  • Hola a todos!!! tengo un problema que estoy seguro que es una tontera... pero aún así me está haciendo renegar. Tengo un ProgressBar, con la propiedad Style = Marquee, y por más que cambie el valor de la propiedad MarqueeAnimationSpeed,la animación casi no se mueve. Este es el código que activa el progressBar, el cual es disparado por un thread para no bloquear la aplicación;

     Private Sub mostrarProgressForm()
      Dim frm As New frmProgress
      frm.ProgressBar1.MarqueeAnimationSpeed = 30
      frm.ProgressBar1.Style = ProgressBarStyle.Marquee
      frm.Label1.Text = "Exportando base de datos. Espere por favor..."
      frm.Show()
    
      While mostrarProgress
       Application.DoEvents()
       Threading.Thread.Sleep(1000)
      End While
      frm.Close()
      frm.Dispose()
     End Sub
    

    La variable MostrarProgress es de tipo boolean y su alcance es de clase.

     

    Espero que me puedan ayudar. Saludos

    Leo González

    miércoles, 13 de octubre de 2010 12:13

Respuestas

  • hola

    el tema es que el procesamiento y la visualizacion del progress van por caminos separados

    - el procesamiento lo puede lanzar en un thread

    - mientras que el progress solo lo muestras

    Usando el ProgressBar con un BackGroundWorker

    en el ejmeplo veras como usar un progress y el BackGroundWorker, este control podria ayudar a implementar thread de forma simple (lo encontraras en al toolbox del VS)

    aqui no se usa un progress del tipo marquee, sino que se informa un avance concreto, pero para el caso seria similar

    antes de lanzar el thread con el BackgroundWorker1.RunWorkerAsync(), en tu caso abririas el form con el progress en marque

    entocnes en el DoWork el thread se procesa y cuando termina se lanza el RunWorkerCompleted, en donde cerrarias el formulario

    por supuesto la instancia del forma deberas declararla a nivel del forma para que pueda ser accesible

    podria ser algo como esto

    Public Class Form1

       Dim frm As New frmProgress 

       Private Sub btnProcesar_Click(...)

          frm.ProgressBar1.MarqueeAnimationSpeed = 30 
          frm.ProgressBar1.Style = ProgressBarStyle.Marquee  
          frm.Label1.Text = "Exportando base de datos. Espere por favor..."  
          frm.Show()

          BackgroundWorker1.RunWorkerAsync()

       End Sub

        Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As  System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

            'aqui realzias el procesamiento

       End Sub

       Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As   System.ComponentModel.RunWorkerCompletedEventArgs) Handles  BackgroundWorker1.RunWorkerCompleted
           
           frm.Close()

       End Sub

    End Class

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 14 de octubre de 2010 3:35

Todas las respuestas

  • hola

    el metodo mostrarProgressForm() es el que lanzas en un thread separado ?

    si es asi me suena raro que no falle tu aplciacion cuando acceder a un control del formulario, ya que lo ahces de forma insegura

    desde un thread no puede acceder directamente a los controles del formulario, debes hacerlo en un callback

     

    el problema lo veo porque usa el Thread.Sleep(1000), ya que este podrias estar deteniendo tambien el progress que se encuentra en el mismo hilo

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta Leo González miércoles, 13 de octubre de 2010 15:53
    • Desmarcado como respuesta Leo González miércoles, 13 de octubre de 2010 15:57
    miércoles, 13 de octubre de 2010 12:22
  • Hola Leandro. Efectivamente como vos decías, era la linea Thread.Sleep(1000) la que me estaba provocando ese comportamiento.

    Al método mostrarProgressForm lo lanzo desde un Thread y no me produce error ni warning. Cuál sería la forma correcta de hacerlo????

     

    Nuevamente muy agradecido por tu ayuda. Saludos

     

    Leonardo González

    miércoles, 13 de octubre de 2010 15:53
  • hola

    el tema es que el procesamiento y la visualizacion del progress van por caminos separados

    - el procesamiento lo puede lanzar en un thread

    - mientras que el progress solo lo muestras

    Usando el ProgressBar con un BackGroundWorker

    en el ejmeplo veras como usar un progress y el BackGroundWorker, este control podria ayudar a implementar thread de forma simple (lo encontraras en al toolbox del VS)

    aqui no se usa un progress del tipo marquee, sino que se informa un avance concreto, pero para el caso seria similar

    antes de lanzar el thread con el BackgroundWorker1.RunWorkerAsync(), en tu caso abririas el form con el progress en marque

    entocnes en el DoWork el thread se procesa y cuando termina se lanza el RunWorkerCompleted, en donde cerrarias el formulario

    por supuesto la instancia del forma deberas declararla a nivel del forma para que pueda ser accesible

    podria ser algo como esto

    Public Class Form1

       Dim frm As New frmProgress 

       Private Sub btnProcesar_Click(...)

          frm.ProgressBar1.MarqueeAnimationSpeed = 30 
          frm.ProgressBar1.Style = ProgressBarStyle.Marquee  
          frm.Label1.Text = "Exportando base de datos. Espere por favor..."  
          frm.Show()

          BackgroundWorker1.RunWorkerAsync()

       End Sub

        Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As  System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

            'aqui realzias el procesamiento

       End Sub

       Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As   System.ComponentModel.RunWorkerCompletedEventArgs) Handles  BackgroundWorker1.RunWorkerCompleted
           
           frm.Close()

       End Sub

    End Class

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 14 de octubre de 2010 3:35