IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

BackgroundWorker et progresschanged


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 102
    Par défaut BackgroundWorker et progresschanged
    Bonjour tout le monde,

    Voila je rencontre un petit problème avec le backgroundworker et le progressChanged.
    Mon programme permet le calcul des empreintes md5 d'un dossier

    Jvous explique.

    J'ai ma form principale qui comprend:
    - une progressBar(pour l'avancer des operations)
    - un label pour indiquer quel fichier est traité
    - un bouton pour lancer un traitement.

    Lors du clic sur le bouton, je fais appel a une nouvelle classe qui me permet de traiter les opérations.

    Dans cette classe, je crée un backgroundworker pour que la fenetre ne freeze pas et j'aimerais:
    - afficher l'etat d'avancement dans la progressBar de la fenetre principale
    - indiquer dans le label quel fichier est traité.


    Principe de la fonction traitement:

    - J'ai un dossier avec x fichiers a l'interieur.
    - Je crée un fichier Md5
    - Pour chaque fichier je calcul l'empreinte Md5 et je l'ajoute dans le fichier Md5
    - a la fin, Je ferme le fichier md5.


    D'apres ce que j'ai compris le bgw , il est interdit de manipuler les éléments d'une form dans le dowork ou la procédure de traitement. Par contre cela est possible dans le eventHandler du progressChanged mais je n'ai pas compris quand est ce que le progressChanged est appelé.

    Pourriez vous m'aider?
    merci

  2. #2
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    C'est toi qui appelle le ProgressChanged avec la commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bgw.ReportProgress(valeur)
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  3. #3
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 102
    Par défaut
    Oui jle lance moi meme, d'accord mais j'ai un autre souci, il me lance le traitement deux fois.

    quand je clique sur le bouton de traitement cela appelle cette procedure (somme.precalcul(tbDir.Text)):

    Public Sub precalcul(ByVal In_dossier As String)
    bgwCalcul.WorkerReportsProgress=True
    bgwCalcul.WorkerSupportsCancellation=True
    AddHandler Me.bgwCalcul.DoWork, AddressOf Me.bgwCalcul_DoWork
    AddHandler Me.bgwCalcul.ProgressChanged, AddressOf Me.bgwCalcul_ProgressChanged
    bgwCalcul.RunWorkerAsync(In_dossier)
    End Sub
    Mon code associé au backgroundworker est le suivant:
    Private Sub bgwCalcul_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgwCalcul.DoWork
    Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)
    e.Result= multi_calcul(e.Argument,worker,e)
    End Sub

    Private Sub bgwCalcul_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgwCalcul.ProgressChanged
    My.Forms.calcul.pgbCalcul_value()
    La fonction de traitement est alors la suivante:
    Public Function multi_calcul(ByVal In_dossier As String, ByVal worker As BackgroundWorker, ByVal e As DoWorkEventArgs) As String
    'en cas d'annulation du calcul
    If worker.CancellationPending Then
    e.Cancel=True
    return "Opération annulée"
    Else
    msgbox("passage dans la partie traitement")
    End If
    End Function
    Voila apres avoir utilisé le debogueur, je m'apercoit qu'il va executer deux fois le traitement.
    Apres avoir traité la ligne e.Result= multi_calcul(e.Argument,worker,e)
    il relance la procedure bgwCalcul_DoWork.
    Est-ce normal?

  4. #4
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    Non c'est pas normal tu dois avoir un autre appel...

    Sinon c'est quoi ca ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    My.Forms.calcul.pgbCalcul_value()
    Et tu peux meme juste écrire :
    Enfin ca dépens, je pense que tu es dans une classe la non ?
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  5. #5
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 102
    Par défaut
    En fait le My.Forms.Calcul.pgbCalcul_value() c pour augmenter la progress bar de la form principal car le calcul se passe dans une classe.

    Sinon pour l'autre appel je ne vois pas

  6. #6
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    Vérifie bien avec des points d'arrêts il doit forcément y avoir un autre appel...
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Backgroundworker problème avec l’évènement Progresschanged
    Par Aeronia dans le forum Windows Forms
    Réponses: 3
    Dernier message: 10/11/2011, 08h40
  2. Paramètres lors de l'event ProgressChanged du BackgroundWorker
    Par GreatDeveloperOnizuka dans le forum C#
    Réponses: 2
    Dernier message: 10/06/2010, 19h14
  3. [VB.net] backgroundworker et UC à 100%
    Par grand_prophete dans le forum Windows Forms
    Réponses: 3
    Dernier message: 15/05/2006, 15h39
  4. [FW2.0][VB.net] backgroundworker
    Par grand_prophete dans le forum Windows Forms
    Réponses: 5
    Dernier message: 03/05/2006, 15h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo