cs_fabiano13
Messages postés262Date d'inscriptionmardi 26 février 2002StatutMembreDernière intervention27 février 2012
-
25 févr. 2011 à 09:07
cs_fabiano13
Messages postés262Date d'inscriptionmardi 26 février 2002StatutMembreDernière intervention27 février 2012
-
25 févr. 2011 à 12:47
Bonjour,
Je n'arrive pas à faire progresser ma progressbar avec un backgroundworker. Ais-je oublié de déclarer quelque chose ?
De plus je pensais que de travailler avec les backgroundworker's cela libéré les ressources graphiques ! Pourtant quand je lance l'opération je ne peux faire aucune autre action pendant le lancement du processus !
Merci d'avance pour vos réponses.
Fabiano
Private WithEvents BckGrdWorkerMonAction As New System.ComponentModel.BackgroundWorker
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.BckGrdWorkerMonAction = New System.ComponentModel.BackgroundWorker()
End Sub
Private Sub MaFonctionDeclanchante()
BckGrdWorkerMonAction.WorkerReportsProgress = True
BckGrdWorkerMonAction.WorkerSupportsCancellation = True
BckGrdWorkerMonAction.RunWorkerAsync()
End Sub
Private Sub BckGrdWorkerMonAction_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BckGrdWorkerMonAction.DoWork
Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)
If Me.InvokeRequired Then
Dim evHandler As DoWorkEventHandler = AddressOf BckGrdWorkerMonAction_DoWork
Me.Invoke(evHandler, sender, e)
Else
Dim SearchAllFilesFileIO = My.Computer.FileSystem.GetFiles("C:\Mon\Chemin", FileIO.SearchOption.SearchAllSubDirectories, "*.*")
Dim CntAllFilesIO As Integer = SearchAllFilesFileIO.Count
Dim i As Integer
For Each files In SearchAllFilesFileIO
worker.ReportProgress(100 * i / CntAllFilesIO, 100 * i / CntAllFilesIO & "%")
Threading.Thread.Sleep(50)
Next
End If
End Sub
Private Sub BckGrdWorkerMonAction_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BckGrdWorkerMonAction.ProgressChanged
If Me.InvokeRequired Then
Dim evHandler As ProgressChangedEventHandler = AddressOf BckGrdWorkerMonAction_ProgressChanged
Me.Invoke(evHandler, sender, e)
Else
System.Threading.Thread.Sleep(50)
ProgressBar1.Value = e.ProgressPercentage
Label1.Text = TryCast(e.UserState, String)
End If
End Sub
Private Sub BckGrdWorkerMonAction_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BckGrdWorkerMonAction.RunWorkerCompleted
If Me.InvokeRequired Then
Dim evHandler As RunWorkerCompletedEventHandler = AddressOf BckGrdWorkerMonAction_RunWorkerCompleted
Me.Invoke(evHandler, sender, e)
Else
Me.ProgressBar1.Value = 0
Me.Label1.Text = "0%"
End If
End Sub
cs_lim
Messages postés329Date d'inscriptionjeudi 20 novembre 2003StatutMembreDernière intervention10 mai 20147 25 févr. 2011 à 11:20
Salut,
Ta form et ton backgroundworker sont deux thread différents, le background ne peut pas directment interagir avec la form. Il faut rajouter un délégué pour cela.
Exemple
'Fonction AffiProgress qui affecte une valeur à la progressbar
Private Function AffiProgress(ByVal value As Integer) As Boolean
ProgressBar1.Value = value
End Function
'Délégue de la fonction AffiProgress (elle doit avoir les mêmes arguments que la fonction qu'elle délègue)
Delegate Function UTDelegate_AffiProgess(ByVal value As Integer) As Boolean
'Instance de mon délégué
Public UTInstance_AffiProgress As Form1.UTDelegate_AffiProgess = New Form1.UTDelegate_AffiProgess(AddressOf Me.AffiProgress )
dans ton background worker tu invoke l'instance de ton délégué
Me.Invoke(UTInstance_AffiProgress, New Object() {e.ProgressPercentage})