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

C# Discussion :

récupérer la fin d'exécution d'un ensemble de BackgroundWorkers


Sujet :

C#

  1. #1
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut récupérer la fin d'exécution d'un ensemble de BackgroundWorkers
    Bonjour,

    j'ai un peu de mal avec les threads en c#, du coup je ne comprends pas trop ce que je lis dans les différentes discussions que je trouve. Alors je viens directement vous demander votre avis.

    Voilà mon problème:
    J'ai tout un tas de petits 'jobs' qui vont être effectué par des BackgroundWorkers. Disons que j'en ai 20 simultanément, et je vais les lancer simultanément. Ces bg workers sont asynchrones, et certains vont se terminer beaucoup plus tard que d'autres. Or j'ai besoin de "savoir" quand ils ont tous terminé leur travail.

    En gros, dans mon main je commence par lancer tous les bg workers. Ensuite, il me faudrait un 'wait' qui attend que tous les workers aient fini leur job. Mais je ne sais pas trop comment implémenter concrètement ceci.
    1er problème: j'ai compris comment récupérer la fin d'un bg worker (en utilisant l'event RunWorkerCompleted). Mais ce que je ne sais pas faire, c'est, une fois que tous les workers ont terminé, comment envoyer un event au 'main' pour lui dire que tous les workers ont terminé. Car je pourrais avoir un flag et un wait (wait tant que le flag est à zéro) dans le main, mais j'en arrive au:
    2eme problème: un wait dans le main avec un flag je trouve ça vraiment moche. On faisait ça il y a longtemps en c++ lorsqu'on avait pas le temps de faire les choses bien, mais c'est ultra moche et une véritable catastrophe en terme de performances. Du coup, j'imagine qu'il doit y avoir, en C#, une façon propre et simple de faire ça, non?
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  2. #2
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Salut,

    voilà comment je vois la chose :
    - pour chaque thread lancé je référence un flag de statut "on job",
    - à chaque event Completed, je change le flag associé vers "completed" et je check les autres status,
    s'ils sont tous "completed" alors je peux faire un traitement final (genre MessageBox.Show("youpi")).
    Plus je connais de langages, plus j'aime le C.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    la méthode simple, surtout s'ils font tous la même chose, c'est quand tu en as démarré 10 tu mets 10 dans une variable, sur l'event completed tu décrémentes de 1
    quand tu arrives à 0 c'est qu'ils sont tous finis
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Merci pour vos réponses.

    Mais en fait, mon problème n'est pas "comment savoir si les jobs sont terminés", mais plutôt "comment récupérer, dans le main, l'évènement correspondant".

    Par exemple, prenons le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    static void Main(string[] args)
    {
       MyThreadManager.Start(); // créé et exécute les BackgroundWorkers
     
       while( MyThreadManager.NumberOfActiveJobs > 0 )
          Thread.Sleep(5000);
     
       MessageBox.Show("youpi");
    }
    Le code ci-dessus fonctionne et fait ce que je souhaite. Le problème c'est que le Thread.Sleep(5000) ne me plait pas pour tout un tas de raison. Du coup, je préfèrerais avoir quelque chose du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    static void Main(string[] args)
    {
       MyThreadManager myThreadManager;
       Thread.Start(myThreadManager); // cette ligne serait bloquante: tant que tous les BackgroundWorker lancés par MyThreadManager ne sont pas terminés, la ligne suivante ne sera pas exécutée
     
       MessageBox.Show("youpi");
    }
    Je sais pas si je suis clair
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  5. #5
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Oki, là je vois deux soucis :
    - la gestion des threads dans une class (static ?) à part > rend effectivement obligatoire la définition d'un event dédié,
    - le mode console > l'exécution principale n'est pas threadée/bouclée, elle n'attendra donc jamais un quelconque event.
    Plus je connais de langages, plus j'aime le C.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    avec la classe manualresetevent il aurait le comportement qu'il souhaite en mode console, à savoir une ligne bloquante jusqu'à déblocage par le code
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Parfait!

    La classe ManualResetEvent fait effectivement ce dont j'ai besoin.

    Un grand merci
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

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

Discussions similaires

  1. [PowerShell] Comment récupérer le code d'erreur à la fin d'exécution d'une commande ?
    Par spynux dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 26/11/2010, 09h18
  2. [POO] Connaître la fin d'exécution d'un fonction
    Par Shandler dans le forum Langage
    Réponses: 4
    Dernier message: 28/01/2007, 18h45
  3. FileInfo - Récupérer «Comments» d'un exécutable
    Par DarkVader dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 27/10/2006, 18h41
  4. [VB6]chaine de caractère: récupérer la fin
    Par kboo dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 28/04/2006, 16h38
  5. Attendre la fin d'exécution d'un page en JS
    Par TekP@f dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 26/08/2005, 15h15

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