Jag har experimenterat lite med progress bars och hittat en extremt irriterande sak med dem. Kör man en progress bar med en 'do while' loop så pausar den iprincip allt annat medans den körs. Hur kan man komma förbi detta? Liten fråga Fungerar Application.DoEvents som i tidigare vb. Att även händelser för t.ex. klick exetueras. Det mest naturliga sättet att lösa en sådan grej tycker jag är att kicka igång prylen med progressbar i en separat tråd och göra "sleep" då och då i loopen. Har jag sagt nåt annat? Men många använder DoEvents utan att disabla knapparna. Sedan får det problem och springer gråttandes till pellesoft för hjälp. Har ju inte hunnit testa så mycket. Men bara man vet vad man gör. Lätt att det trasslar till sig med trådar.<br>Progress Bars
Sv: Progress Bars
Hej,
Du lägger in:
<code>
Application.DoEvents
</code>
någonstans inne i loopen.
//freddaSv: Progress Bars
I så fall bör man tänka sig för. Kan innebära att man kan starta processen flera gånger om.
Ska du bara uppdatera layouten så är refresh metoden mer lämplig.
Vill du även ha cancel möjlighet Kan du använda samma knapp som du startar fast ändra text. Eller Disabla startknappen för att hindra att man trycker på den igen.Sv: Progress Bars
Sv: Progress Bars
Informerade bara i förebyggande syfte.Sv: Progress Bars
<br>
Jag skulle starta en tråd. Köra den långa processen i den för att lämna fönster tråden fri att hantera uppdateringar och events:
<code>
Private mThread As System.Threading.Thread
Private Sub LongProcess()
Dim Start As Date
Dim Temp As TimeSpan
ProgressBar1.Maximum = 5
Try
Start = Now
Do
Temp = Now.Subtract(Start)
ProgressBar1.Value = Temp.Seconds
Loop While Temp.Seconds < 5
Catch E As Threading.ThreadAbortException
MessageBox.Show("Du avbröt processen!", "Long Process", MessageBoxButtons.OK, MessageBoxIcon.Information)
Finally
ProgressBar1.Value = 0
cmdStart.Enabled = True
cmdCancel.Enabled = False
End Try
MessageBox.Show("Färdig!!!", "Long Process", MessageBoxButtons.OK, MessageBoxIcon.Information)
End Sub
Private Sub cmdStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdStart.Click
cmdStart.Enabled = False
mThread = New Threading.Thread(AddressOf LongProcess)
mThread.Start()
cmdCancel.Enabled = True
End Sub
Private Sub cmdCancel_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdCancel.Click
Me.Close()
End Sub
Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
If Not mThread Is Nothing Then
mThread.Abort()
mThread = Nothing
End If
End Sub
</code>