Comment faire progresser une ProgressBar avec un BackgroundWorker, voici mon cod

Résolu
cs_fabiano13 Messages postés 262 Date d'inscription mardi 26 février 2002 Statut Membre Dernière intervention 27 février 2012 - 25 févr. 2011 à 09:07
cs_fabiano13 Messages postés 262 Date d'inscription mardi 26 février 2002 Statut Membre Dernière intervention 27 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

2 réponses

cs_lim Messages postés 329 Date d'inscription jeudi 20 novembre 2003 Statut Membre Dernière intervention 10 mai 2014 7
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})

cela devrait résoudre ton souci d'affichage



@+LIM
3
Rejoignez-nous