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

VB.NET Discussion :

Problème dans l'utilisation successive du même backgroundworker


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 37
    Par défaut Problème dans l'utilisation successive du même backgroundworker
    Bonjour,

    J'ai une boucle qui fait appel à plusieurs backgroundworker, et j'aimerai avancer dans ma boucle seulement quand le traitement de tous mes backgroundworker est fini.

    Pour détailler un peu plus mon problème :

    J'ai un ensemble de village appartenant à des zones d'études, pour chaque zone d'étude je lance 3 backgroundworker qui effectuent un traitement sur mes villages qui peut être assez long (qq secondes) puis je passe à la zone d'étude suivante. Il faut donc que le travail des backgroundworker sur la zone détude courante soit fini avant de passer à la zone d'étude suivante. Je n'arrive pas à programmer cette condition: voici mon code :

    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
     
     
            For i = 0 To gStudyAreaDictionary.Values.Count - 1
    'Initialisation des listes de village sur lesquels travaillent chacun de mes bgw
                Dim ParamCalcul As ParamCalcul = fnCalculParamStudyArea(gDtset, dsParam, 1, gStudyAreaDictionary.Values(i).Name)
                If gStudyAreaDictionary.Values(i).Calculation Then
                    For Each Vil As Village In gStudyAreaDictionary.Values(i).VillageList
                        If iNbVill Mod 2 = 0 Then
                            listVillage1.Add(Vil)
                        Else
                            listVillage2.Add(Vil)
                        End If
                        iNbVill = iNbVill + 1
                    Next
     
                    While gBGW1.IsBusy Or BGW2.IsBusy
                        System.Threading.Thread.Sleep(100)
                    End While
     
                    If listVillage1.Count <> 0 Then
                        Dim ParamCalcul1 As ParamCalcul = ParamCalcul.Copy(listVillage1)
                        gBGW1.RunWorkerAsync(ParamCalcul1)
                    End If
                    If listVillage2.Count <> 0 Then
                        Dim ParamCalcul2 As ParamCalcul = ParamCalcul.Copy(listVillage2)
                        gBGW2.RunWorkerAsync(ParamCalcul2)
                    End If
     
     
                End If
     
            Next
    Dans cette version du code le thread principal reste blocké dans la boucle while même quand bgw1 et bgw2 ont fini leur traitement.

    J'ai essayé de mettre mes propres drapeaux à la fin des do_work de mes background worker pour voir quand le traitement est fini mais j'ai le problème inverse : lors de l'itération suivante de la boucle j'ai une erreur comme quoi le backgroundworker en question est toujours occupé alors que je sais que le do_work est fini. (J'ai mis à jour un booléan global just avant le endsub de l'évènement do_work des background worker)...

    Une solution pour contourner ce problème serait de créer autant de bgw que de zones d'études mais à ce compte là je ne sais pas comment m'y prendre pour indiquer que faire à mes bgw dynamiques... Si je connais pas le nom de mon objet qui déclenche l'évènement do_work comment j'indique le traitement de cet évènement??

  2. #2
    Membre émérite Avatar de yonpo
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2010
    Messages
    617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 617
    Par défaut
    Salut,

    Sers-toi de l'évènement RunWorkerCompleted. Il sera levé à la fin de l'execution d'un Backgrounworker.

  3. #3
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    et sender sera l'instance déclenchant l'évènement
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 37
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    et sender sera l'instance déclenchant l'évènement
    Euh... Je comprends pas ce que tu veux dire...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 37
    Par défaut
    En fait quand je suis l’exécution pas à pas de ce qui se passe dans mes backgroundworker, à la fin du do_work il ne se passe rien... Je pense que l'on retourne dans le thread principal qui de toute façon est bloqué dans le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while
    sleep(10)
    end while

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    ton code a l'air mal conçu, j'ai pas trop compris pourquoi tu attends que bgw1 et 2 aient fini, le threadpool aurait été pas mal je pense

    ensuite le démarrage de tout ca doit être sur un thread séparé si tu veux faire de la gestion sur les threads (attente ou autre)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 37
    Par défaut
    Je ne doute pas que mon code soit mal conçu ! Le multithreading reste assez obscur pour moi...

    J'attends que bgw1 et 2 aient fini car ma boucle principale dans laquelle je les lance va beaucoup plus vite que l’exécution de bgw1 et 2, si je n'attends pas je reçois une erreur comme quoi ils ne peuvent pas lancer de nouveaux calculs car ils sont occupés...

    Je ne sais pas ce que c'est que le threadpool, mais le nom a l'air bien! Si ça permet de lancer plusieurs calculs en parallèle ça peut m'intéresser! Tu pourrais m'indiquer où je peux trouver plus de détails sur la question?

    Je suis en voie de résoudre mon problème, pour être sur qu'ils ne sont plus occupés quand ils ont fini leur calculs, j'ai lancé à la main les évènements workruncompleted mais ça n'a pas fait basculer la propriété isbusy à false du coup à la place je réinstancient mes bgw à la fin de leur calculs, c'est bourrin mais ça marche...
    Par contre j'ai encore un problème: ma barre de progression ne se mets plus à jour... Je pense que les évènement progress_changed sont masqué par mon sleep() tout comme les runworkcompleted l'étaient.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 37
    Par défaut
    J'ai essayé de lever mes drapeaux dans l'évènement runworkercompleted mais ça ne marche pas. L'execution reste bloqué dans mon while. L'execution n'arrive jamais au runworkercompleted : même quand j'y mets des point d'arret ils ne se déclenchent pas...

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/04/2008, 00h01
  2. Problème dans l'utilisation d'un tableau
    Par NoiBe dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 16/05/2007, 16h19
  3. problème dans l'utilisation de g_access()
    Par bit_o dans le forum GTK+ avec C & C++
    Réponses: 18
    Dernier message: 02/03/2007, 14h57
  4. Problème dans l'utilisation du WebBrowser
    Par MCShiff dans le forum Windows Forms
    Réponses: 2
    Dernier message: 10/01/2007, 12h52
  5. probléme dans l'utilisation d'un tableau
    Par hamoudasafira dans le forum C++
    Réponses: 10
    Dernier message: 13/12/2006, 08h50

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