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 :

gestion de Thread


Sujet :

C#

  1. #1
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut gestion de Thread
    salut les gars

    j'ai besoin de vos avis/idées, je patauge complètement avec les Thread ...
    c'est la 1ere fois que je vais essayer de faire un "petit projet" personnel et j'ai l'impression d'être un aveugle qu'on a lancé dans un champ de mine

    pour l'instant je suis sur un projet annexe dédié a tous les tests que j'ai besoin de faire pour comprendre le fonctionnement des Thread et la manière de les utiliser .... intelligemment (pas gagné ).


    voici le code de mon appli winforms de test :

    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
     
     
    // Evenement load de mon Form
    private void Form1_Load(object sender, EventArgs e)
    {  Debug.WriteLine("-------------------------------------------------------------------");
        for (int a = 0; a < 5; a++) {
            ThreadGestion threadGestion = new ThreadGestion(a);
            ThreadStart delegue = new ThreadStart(threadGestion.tester);
            Thread tache = new Thread(delegue);
            tache.Name = "Thread " + a;
            Debug.WriteLine("Lancement : " + tache.Name);
            tache.Start();
        }
    }
     
    // la classe de gestion des thread et des actions qu'ils doivent effectuer
    public class ThreadGestion
    {
        public static int[] _tbCompteur = new int[] { 0, 0, 0, 0, 0 };
        public int _index;
     
        public ThreadGestion(int index)
        {
            _index = index;
        }
        public void tester()
        {
            while (Thread.CurrentThread.IsAlive) {
                Debug.WriteLine("tester(" + Thread.CurrentThread.Name + ") : " + ThreadGestion._tbCompteur[_index]);
                ThreadGestion._tbCompteur[_index]++;
                if (ThreadGestion._tbCompteur[_index] > 5) {
                    Debug.WriteLine("ARRET : " + Thread.CurrentThread.Name);
                    Thread.CurrentThread.Abort();
                }
            }
        }
    }
    l'évènement Form1_Load va créer 5 Thread.
    chacun des Thread recevra un index (0 a 4) qu'il va utiliser pour incrémenter la valeur correspondant a l'index dans un tableau de int.

    la classe ThreadGestion va s'occuper de gérer l'action des Thread et stocker en static le tableau de int dont les 5 valeurs devront être incrémentées jusqu'à 5.


    voici le résultat en sortie :
    -------------------------------------------------------------------
    Lancement : Thread 0
    Lancement : Thread 1
    Lancement : Thread 2
    tester(Thread 0) : 0
    tester(Thread 1) : 0
    tester(Thread 1) : 1
    tester(Thread 1) : 2
    tester(Thread 1) : 3
    tester(Thread 1) : 4
    tester(Thread 1) : 5
    ARRET : Thread 1
    tester(Thread 0) : 1
    tester(Thread 0) : 2
    tester(Thread 2) : 0
    Une exception de première chance de type 'System.Threading.ThreadAbortException' s'est produite dans mscorlib.dll
    Lancement : Thread 3
    Le thread 0xad0 s'est arrêté avec le code 0 (0x0).
    tester(Thread 0) : 3
    tester(Thread 0) : 4
    tester(Thread 2) : 1
    tester(Thread 2) : 2
    tester(Thread 2) : 3
    tester(Thread 2) : 4
    tester(Thread 3) : 0
    tester(Thread 3) : 1
    tester(Thread 3) : 2
    tester(Thread 3) : 3
    tester(Thread 3) : 4
    tester(Thread 3) : 5
    ARRET : Thread 3
    tester(Thread 0) : 5
    ARRET : Thread 0
    Une exception de première chance de type 'System.Threading.ThreadAbortException' s'est produite dans mscorlib.dll
    tester(Thread 2) : 5
    Une exception de première chance de type 'System.Threading.ThreadAbortException' s'est produite dans mscorlib.dll
    Le thread 0xc9c s'est arrêté avec le code 0 (0x0).
    Le thread 0xabc s'est arrêté avec le code 0 (0x0).
    Lancement : Thread 4
    ARRET : Thread 2
    tester(Thread 4) : 0
    Une exception de première chance de type 'System.Threading.ThreadAbortException' s'est produite dans mscorlib.dll
    tester(Thread 4) : 1
    tester(Thread 4) : 2
    Le thread 0xda0 s'est arrêté avec le code 0 (0x0).
    tester(Thread 4) : 3
    tester(Thread 4) : 4
    tester(Thread 4) : 5
    ARRET : Thread 4
    Une exception de première chance de type 'System.Threading.ThreadAbortException' s'est produite dans mscorlib.dll
    Le thread 0xcd0 s'est arrêté avec le code 0 (0x0).
    'testThread_FTP.vshost.exe' (Managé)*: 'C:\WINDOWS\assembly\GAC_MSIL\mscorlib.resources\2.0.0.0_fr_b77a5c561934e089\mscorlib.resources.dll' chargé
    Le thread 0xaa4 s'est arrêté avec le code 0 (0x0).
    Le thread 0xac8 s'est arrêté avec le code 0 (0x0).
    Le programme '[2992] testThread_FTP.vshost.exe: Managé' s'est arrêté avec le code 0 (0x0).

    j'utilise du Debug.writeLine() a tous les niveaux pour bien suivre ce qui ce passe et c'est la que je découvre le problème ... j'ai des choses bizarres dans le panneau de sortie sans être capable de comprendre pourquoi
    ya plein d'exceptions


    quelqu'un a une idée sur le(s) problème(s)


    merci

  2. #2
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    En regardant le nom de l'exception cela devrait te sauter aux yeux pourtant : ThreadAbortException. La sémantique est très claire dans le cas présent

    On se doute à ce moment que c'est lié à la méthode Abort. On prend alors la documentation MSDN de la méthode Thread.Abort() et que voit-on ?
    Déclenche ThreadAbortException dans le thread sur lequel l'appel a lieu pour commencer le processus d'arrêt du thread. L'appel de cette méthode arrête généralement le thread.
    Ca c'est pour l'explication de l'exception. Maintenant, la grosse erreur c'est d'appeler Abort ! C'est absolument inutile de procéder ainsi car pour terminer le thread il suffit de sortir de la méthode associée avec un simple return.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...
    if (ThreadGestion._tbCompteur[_index] > 5) 
    {
        Debug.WriteLine("ARRET : " + Thread.CurrentThread.Name);
        return;
    }
    ...
    Tout devrait aller bien mieux à partir de là.

  3. #3
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut
    merci

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

Discussions similaires

  1. gestion des threads
    Par yanis97 dans le forum Langage
    Réponses: 6
    Dernier message: 20/04/2006, 12h41
  2. Gestion des Threads
    Par Nalfouille dans le forum MFC
    Réponses: 3
    Dernier message: 05/04/2006, 16h29
  3. Gestion des threads
    Par yanis97 dans le forum C++
    Réponses: 6
    Dernier message: 08/03/2006, 09h39
  4. GEstion des thread
    Par Julien Dufour dans le forum Access
    Réponses: 8
    Dernier message: 06/10/2004, 14h28
  5. [reseaux] Gestion des threads en perl
    Par totox17 dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 28/11/2002, 09h40

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