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 :

Multi thread - Syntaxe + Attente fin de thread enfant [Débutant]


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    ingénieur mécanique
    Inscrit en
    Octobre 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur mécanique

    Informations forums :
    Inscription : Octobre 2016
    Messages : 22
    Points : 18
    Points
    18
    Par défaut Multi thread - Syntaxe + Attente fin de thread enfant
    Bonjour,

    Je cherche à rendre mon application plus rapide en utilisant le multi threading.
    Voici un exemple :
    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
     
    public static Semaphore _Sema1; // semaphore pour écrire dans la variable contenant les erreurs
    public static void CheckDossExist(object path)
    {
        if (!System.IO.Directory.Exists(Settings.Default.Path + (string)path))
        {
            /* je vais placer ici mes actions longues */
            _Sema1.WaitOne();
            Variables.ErrorReport += (string)path + "\n"; // variable de type string qui sera affiché dans une MessageBox pour avertir des erreurs
            _Sema1.Release();
        }
    }
    public static void Init()
    {
        Variables.ErrorReport = "";
        _Sema1 = new Semaphore(1, 1);
        Thread t1 = new Thread(new ParameterizedThreadStart(CheckDossExist));
        t1.Start(Constantes.XmlFolder);
        Thread t2 = new Thread(new ParameterizedThreadStart(CheckDossExist));
        t2.Start(Constantes.AsmFolder);
        Thread t3 = new Thread(new ParameterizedThreadStart(CheckDossExist));
        t3.Start(Constantes.PartFolder);
        while (t1.IsAlive || t2.IsAlive || t3.IsAlive) ;
    Deux questions :
    - Y-a-t-il une autre solution que de nommé les threads (t1, ...) => remplacer le while(t1.IsAlive) par while(ChildThread.IsAlive) pour simplifier mon code.
    - Est-ce que j'utilise la bonne méthode pour créer plusieurs entrées dans la même sous fonction avec des paramètres différents ?

    Merci par avance.
    Et bon weekend.

  2. #2
    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
    les variables tu leurs donne le nom que tu veux, ca doit être toi qui a choisit t1 donc tu peux mettre autre chose ...

    après oui il y a plein de choses, mais le mieux serait que tu lise un tuto (ou plusieurs) sur les différents sujets à propos du multithreading et de l'asynchronisme
    déjà rien que F1 sur thread tu aurais vu la liste des membres, dont la méthode .Join qui permet d'attendre la fin d'un thread (plutot qu'un while isalive)

    après ici tu veux faire 3x la même chose avec des paramètres différents, donc un parallel.foreach qui équivaut en une boucle à un traitement parallélisé avec attente que tous aient fini

    donc trouve un peu de lecture sur :
    thread / invoke / callback
    threadpool / task
    parallel (https://msdn.microsoft.com/fr-fr/lib...or=-2147217396 lien cadeau, je voulais vérifier que c'était bien une classe ^^)
    async / await
    lock
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre à l'essai
    Homme Profil pro
    ingénieur mécanique
    Inscrit en
    Octobre 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur mécanique

    Informations forums :
    Inscription : Octobre 2016
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Super.

    Merci beaucoup !!
    Je vais mettre le poste sur résolu, ça me laissera le temps de me renseigner sur ces mots clefs, et je reviendrai mettre en conclusion le bout de code amélioré.

  4. #4
    Membre à l'essai
    Homme Profil pro
    ingénieur mécanique
    Inscrit en
    Octobre 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur mécanique

    Informations forums :
    Inscription : Octobre 2016
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    Comme promis, je reviens sur le sujet (un peu tard, certes) pour faire un point sur ce que j'ai compris, si ça peut aider quelqu'un :

    Pour cela, je vais m'appuyer sur le site : http://tipsandtricks.runicsoft.com/C...llelClass.html

    De mon œil de débutant, je résumerais qu'il y a un outil pratique "Paralell.xxx" depuis le ".NET 4.0" qui permet d'exécuter de manière asynchrone quelques tâches dans du code synchrone :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    static void F1 () {  Console .WriteLine ( "F1 ()" ); } 
    static  void  F2 () {  Console .WriteLine ( "F2 ()" ); } 
    static  void  F3 () {  Console .WriteLine ( "F3 ()" ); } 
     
    static  void  TestInvoke () 
    { 
        // Code 1
        Parallel .invoke (F1, F2, F3);
        // Code 2 
    }
    Dans cette exemple, une fois le "Code 1" exécuté, les tâches F1 à F3 seront exécutées parallèlement, et on attendra que ces 3 tâches soient finies avant d'exécuter le "Code 2".
    C'est donc une manière très simple pour s'initier et améliorer les performance de nos programmes.

  5. #5
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Je t'invite à jeter un oeil sur les tutoriels que j'ai écris sur l'utilisation du pool de threads. Tu y trouveras des infos sur... le pool de thread, async/await, les Task, etc...
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

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

Discussions similaires

  1. [Multi thread] Attendre la fin des threads
    Par rvzip64 dans le forum Langage
    Réponses: 4
    Dernier message: 12/05/2015, 10h53
  2. [C#] Attente fin de thread
    Par ekinox17 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 18/05/2006, 15h52
  3. Réponses: 6
    Dernier message: 27/10/2005, 12h58
  4. [Thread] Connaitre la fin d'execution d'un thread
    Par charmante dans le forum Concurrence et multi-thread
    Réponses: 6
    Dernier message: 05/10/2005, 18h57
  5. fenêtre d'attente dans un thread
    Par KRis dans le forum Langage
    Réponses: 3
    Dernier message: 25/08/2005, 10h29

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