2013-01-08 4 views
6

Eventuali duplicati:
.NET progressbar not updatingVB.NET Progress Bar

ho costruito una classe barra di avanzamento che mostra l'avanzamento nel mio cicli for. Ecco il codice per la classe barra di avanzamento:

Public Class frmProgress 
Private Sub frmProgress_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 
    progressBar.Minimum = 0 
End Sub 

Public Sub ProgressBarSetup(ByRef Maximum As Integer, ByRef Title As String) 
    progressBar.Maximum = Maximum 
    progressBar.Value = 0 
    Me.Text = Title 
    Me.Show() 
End Sub 

Public Sub IncProg() 
    progressBar.Value += 1 
    Application.DoEvents() 

    If progressBar.Value = progressBar.Maximum Then 
     Me.Close() 
    End If 
End Sub 
End Class 

Ecco come avrei usato in un ciclo for:

Dim pb As New ProgressBar 
pb.ProgressBarSetup(5000, "Test") 

For i As Integer = 0 To 5000 - 1 
     pb.IncProg() 
Next 

Il problema è un problema visivo. Completa fino al 70-85% della barra di avanzamento completa e poi si chiude. Alla chiusura, il valore della barra di avanzamento e i valori massimi sono uguali, tuttavia la barra viene riempita solo per circa tre quarti della sua lunghezza.

Ho provato a utilizzare progressBar.Refresh() anziché Application.DoEvents() ma rallenta il progresso di molto - e mi dà ancora lo stesso risultato.

Esistono altri modi per ottenere una barra di avanzamento visivamente migliore?

risposta

12

Vedere questo effetto è normale su Windows 7. Il problema si verifica quando si imposta un valore su X, che scorre in questa posizione nel successivo 0,5-1 secondo. Quindi se la tua azione sta accadendo velocemente, la vedrai solo al 50-80%. La soluzione è impostare prima un valore più alto e poi decrementare quello desiderato. Qualcosa di simile a questo:

progressBar.Value += 2 
progressBar.Value -= 1 

e anche non dimenticare di aumentare temporaneamente il massimo, o si può ottenere una deroga, per esempio, quando l'incremento 4999-5000 (non è possibile impostare a 5001).

+0

Va bene ci proverò. e sì ho dimenticato di mettere 5000-1: p è stato solo per un esempio. Grazie! Vado a provarlo ora – Alex

+0

Perfetto. Che funzioni! Eccellente. Accetterò la tua risposta non appena il sito mi permetterà :) Molto apprezzato! – Alex

+0

grazie! Questo mi stava facendo impazzire, l'ho impostato a 50 (%) e sarebbe salito a 1/3 ... – Sebastian