none
Utilisation d'une progressbar et d'un backgroundworker RRS feed

  • Question

  • Bonjour,

    Je fais un petit programme de copie en utilisant un backgroundworker, je m'explique:

    -Je créée une fonction générale (que j'appèlerai "CopieDossiers" ici)qui analyse et copie tous les fichiers et sous dossiers d'un dossier.

    - je créée divers "sub" qui correspondent à des dossiers  de chaque profil du pc, que je veux copier juste en cliquant sur un bouton.

    - Dans ces sub je rappelle donc ma fonction "Copiedossiers", où je dis que pour chaque profils j'exécute ma fonction en métant entre parenthèse la source et la destination..... CopieDossiers(source, destination).

    - J'utilise alors le backgroundworker pour exécuter tout ça:

    Comme la copie doit se faire lorsque je clique sur un bouton:

    Private Sub Bouton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_BackUp.Click
    BackgroundWorker1.RunWorkerAsync()
    End Sub

     Le BackgroundWorker1.RunworkerAsync() exécute donc tous ce qui se trouve dans le "BackgroundWorker1_DoWork"

    Dans ce DoWork j'y mets donc tout mes "sub" de copie

    Puis je fini par un "BackgroundWorker1_RunWorkerCompleted" pour indiquer dans un label.text que la copie est finie.

    Pour suivre tout ça je veux utiliser une progressbar avec le nombre total des fichiers.

    Je compte donc tous mes fichiers en utilisant le même procédé de la copie, c'est a dire en utilisant une fonction générale et des sub utilisant la fonction où je dis que chaque fichier checké = 1, puis une variable additionne tous ces 1 chécké.

    Pour ma progressbar je dis donc que "progressbar.step = 1" et je rajoute à ma fonction générale de copie, que pour chaque fichier copier -> "progressbar.performstep"

    Ce procédé fonctionne très bien pour la progressbar si je n'utilisait pas de backgrounworker, mais avec, j'ai un message d'erreur qui me dis: "Opération inter-threads non valide : le contrôle '' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé."

    Je sais que je dois utiliser un "delegate" et "invoke" mais j'ai beau lire les forums et tutos mais j'y comprends pas grand chose.

    Je sais pas quoi écrire dans ma fonction générale, mon DoWork et autre.

    Voila, je sais que j'ai été long, mais je voulais être le plus clair possible.

    Quelqu'un pour m'aider?


    • Modifié Bylliboy dimanche 15 juin 2014 22:26
    dimanche 15 juin 2014 22:25

Réponses

  • Bon, j'ai réussi à faire fonctionner ma progressbar avec mon bgw.
    Il faut:
    - créer un "delegate" commun à tous, chez moi ce sera :

    Delegate Sub dIncrement()
    - créer le sub où l'on incorpore le code que l'on veut exécuter, chez moi ce sera:
    Private Sub Increment()
                  PGB_STATUT.PerformStep()
        End Sub


    - et enfin rappeler dans la fonction où je voulais, à la base, mettre mon " PGB_STATUT.PerformStep()", le sub comme suit:

    Me.Invoke(New dIncrement(AddressOf Increment))

    Merci au tutos de SDZ (OCR).

    • Marqué comme réponse Bylliboy mercredi 18 juin 2014 09:27
    mercredi 18 juin 2014 09:27

Toutes les réponses

  • Bonjour,

    Vous devez dans l'événement DoWork reporter la progression via :

    Me.MonBackgroundWorker.ReportProgress(xxx)

    Et ensuite abonnez vous à l'événement ProgressChanged de votre BackgroundWorker

    Me.ProgressBar.Value = e.ProgressPercentage

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    dimanche 15 juin 2014 23:07
    Modérateur
  • Oui, mais de cette manière c'est moi qui donne le pourcentage de progression en marquant aux endroits voulus Backgroundworker1.reportProgress(5 ou 10 ou 15 ou ce que je veux) dans mon dowork, ce qui ne reflète pas vraiment la réalité suivant la taille des dossiers.

    Or moi je récupère le nombre total de fichiers (qui devient le progressbar.max) à copier et je veux faire avancer ma progressbar de 1 à chaque fichier copié jusqu'au ".max".

    lundi 16 juin 2014 08:04
  • Bon, j'ai réussi à faire fonctionner ma progressbar avec mon bgw.
    Il faut:
    - créer un "delegate" commun à tous, chez moi ce sera :

    Delegate Sub dIncrement()
    - créer le sub où l'on incorpore le code que l'on veut exécuter, chez moi ce sera:
    Private Sub Increment()
                  PGB_STATUT.PerformStep()
        End Sub


    - et enfin rappeler dans la fonction où je voulais, à la base, mettre mon " PGB_STATUT.PerformStep()", le sub comme suit:

    Me.Invoke(New dIncrement(AddressOf Increment))

    Merci au tutos de SDZ (OCR).

    • Marqué comme réponse Bylliboy mercredi 18 juin 2014 09:27
    mercredi 18 juin 2014 09:27