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 :

L'Events DoWork de BackGroundWorker est appelé 2 fois, savez-vous pourquoi?


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Avril 2006
    Messages : 21
    Par défaut L'Events DoWork de BackGroundWorker est appelé 2 fois, savez-vous pourquoi?
    Bonjour,

    J'utilise un BackGroundWorker pour éviter de freezed mon application et en profiter pour afficher une progressBar.

    Le composant BackGroundWorker est assez facile à utiliser surtout si on lit le tuto disponible sur le site mais il y a quand même un truc qui me chiffonne.

    Pourquoi l'Event DoWork est-elle exécutée 2 fois alors que je ne fais qu'un seul appel à la méthode RunWorkerAsync() ??

    Je ne comprends vraiment pas et cela n'arrange pas mon histoire, je pourrais très bien bidouiller mais je préfère avoir une explication ou une alternative.

    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
    Chez moi il est appelé une seule fois... Peux tu poster un morceau de code ?
    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 averti
    Inscrit en
    Avril 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Avril 2006
    Messages : 21
    Par défaut Code
    Citation Envoyé par Aspic
    Chez moi il est appelé une seule fois... Peux tu poster un morceau de code ?
    Bien sûr!

    La déclaration est faite dans l'en-tête de la classe MainForm qui est ma Form principale:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private WithEvents bgwCode As System.ComponentModel.BackGroundWorker
    L'initialisation du composant BackGroundWorker est établie au chargement de la Form principale:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            bgwCode = New System.ComponentModel.BackgroundWorker
            bgwCode.WorkerReportsProgress = True
            bgwCode.WorkerSupportsCancellation = False
     
            AddHandler bgwCode.DoWork, AddressOf bgwCode_DoWork
            AddHandler bgwCode.RunWorkerCompleted, AddressOf bgwCode_RunWorkerCompleted
            AddHandler bgwCode.ProgressChanged, AddressOf bgwCode_ProgressChanged
    L'appuie sur le bouton ButtonGenerate de la Form principale appelle la méthode RunWorkerAsync:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Private Sub ButtonGenerate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonGenerateFilesForReading.Click
     
            srcFiles = GetDisplayInfo(srcFilesTabPages, srcFiles)
     
            ProgressBarForm.Show()
            ProgressBarForm.ProgressBar.Value = 0
            bgwCode.RunWorkerAsync()
     
        End Sub
    Voici l'évènement DoWork:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Private Sub bgwCode_DoWork( _
            ByVal sender As System.Object, _
            ByVal e As System.ComponentModel.DoWorkEventArgs) _
            Handles bgwCode.DoWork
     
            Dim worker As System.ComponentModel.BackgroundWorker = CType(sender, System.ComponentModel.BackgroundWorker)
     
            e.Result = MakeFilesForReadingOf(srcFiles, worker, ExcelApp)
        End Sub

  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
    Pourrais aussi avoir le detail de MakeFilesForReadingOf car tu passes worker en paramètre et je comprends pas pourquoi...

    De plus pourquoi as tu créér ton BGW manuellement ? Tu aurais pu le poser depuis l'interphace graphique et tout aurait été généré automatiquement...
    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 averti
    Inscrit en
    Avril 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Avril 2006
    Messages : 21
    Par défaut Détail de MakeFilesForReadingOf
    Citation Envoyé par Aspic
    Pourrais aussi avoir le detail de MakeFilesForReadingOf car tu passes worker en paramètre et je comprends pas pourquoi...
    J'envoie en paramètre le BGW car j'utilise la méthode ReportProgress du BGW. Je m'en sers pour la ProgressBar. D'ailleurs ça fonctionne très bien sauf que l'appel double de l'Event DoWork fait tout foirer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
        Public Function MakeFilesForReadingOf(ByRef srcFiles As ArrayList, ByVal worker As System.ComponentModel.BackgroundWorker, ByRef ExcelApp As Excel.Application) As Boolean
     
            Dim fileIndex, sheetIndex As Integer
            Dim nbFiles, nbSheets As Integer
     
            Dim nbTotalSheets, nbTotalSheetsIndex As Integer
     
     
            nbFiles = srcFiles.Count
     
            nbTotalSheets = 0
            nbTotalSheetsIndex = 0
     
            For fileIndex = 0 To nbFiles - 1
                nbTotalSheets = nbTotalSheets + srcFiles(fileIndex).Sheets.Count
            Next
     
            Dim percentage As Integer
     
            Try
     
                For fileIndex = 0 To nbFiles - 1
     
                    nbSheets = srcFiles(fileIndex).Sheets.Count
     
                    For sheetIndex = 0 To nbSheets - 1
     
                        '
                        '
                        '
                        'Traitement Excel
                        '
                        '
                        nbTotalSheetsIndex = nbTotalSheetsIndex + 1
                        percentage = CInt((CDec(nbTotalSheetsIndex) / CDec(nbTotalSheets)) * 100)
                        worker.ReportProgress(percentage)
     
                        System.Threading.Thread.Sleep(10) ' pour les tests
     
                    Next
                Next
     
                Return True
     
            Catch ex As Exception
                MessageBox.Show(ex.Message)
                Return False
            End Try
     
     
        End Function
     
    End Module
    De plus pourquoi as tu créér ton BGW manuellement ? Tu aurais pu le poser depuis l'interphace graphique et tout aurait été généré automatiquement...
    Eh bien, c'est tout bête. Je ne suis pas programmeur dans la vie et au travail je ne peux rien installer sur mon pc, c'est la politique de la maison. Donc, quand j'ai du temps libre je tape des morceaux de codes sous Notepad LOL et je teste chez moi sous Visual Basic 2005 Express. Et en général ça marche Mais c'est vrai tu as raison, je vais essayer en Concept Design et je te tiens au courant si jamais tu ne vois pas d'où vient le problème.

    Merci!

    [Edit = Ai testé le BGW en mode "Concepteur de Vue"]
    Bah mince alors... je viens de créer le composant en mode design j'ai mis mon BGW sur la Form principale, j'ai adapté le code et maintenant ça marche nikel. Je n'arrive pas à comprendre Si jamais tu as une idée, j'aimerais bien comprendre ce que j'ai fait de travers, j'aime apprendre de mes erreurs Sinon je mets ce post en résolu avant la fin du week-end.

    Merci encore!

  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
    Bon bah voila

    Essaye de virer le worker.ReportProgress(percentage) est ce que l'evenement do_work se declanche toujours deux fois ?

    SInon il faut mettre des points d'arret pour voir ou sa cloche car première vu, il n'y a pas d'erreur dans l'initialisation de ton BGW.
    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. [Débutant] Regénération des objets si le form est appelé plusieurs fois
    Par patrickvier dans le forum VB.NET
    Réponses: 22
    Dernier message: 13/05/2015, 08h52
  2. Réponses: 5
    Dernier message: 01/03/2015, 19h02
  3. Réponses: 1
    Dernier message: 03/08/2012, 15h06
  4. [vb.net] [textbox] pourquoi validating est appellée
    Par graphicsxp dans le forum Windows Forms
    Réponses: 4
    Dernier message: 02/11/2005, 11h09
  5. Réponses: 3
    Dernier message: 26/02/2005, 09h33

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