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

Dotnet Discussion :

Classe lanceuse de Thread et nettoyage


Sujet :

Dotnet

  1. #1
    Membre éclairé Avatar de TSalm
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 361
    Par défaut Classe lanceuse de Thread et nettoyage
    Bonjour,

    De façon classique, j'ai un Thread que je lance en instanciant ce genre de classe :
    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
     
    class MyThread {
     int data1 , data2;
     
     public MyThread(int data1,int data2) {
      this.data1 = data1;
      this.data2 = data2;
     
      Thread t = new Thread( new ThreadStart ( run ) );
      t.Start();
     }
     
     public void run() {
      // - en paralléle
      // - utilisation de data1 et data2
      ....
     }
     
    }
    Cette instance ne servant qu'à lancer le Thread, est-elle bien nettoyée par le GC ?
    Y a t-il un moyen de suivre ce que nettoie le GC ?

    D'avance merci,
    TSalm

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Ben c'est comme les autres classes, une instance est nettoyée par le GC quand il n'y à plus aucune référence à cette instance... le fait qu'elle lance un thread ne change rien il me semble.

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Par défaut
    Salut,

    A mon avis ton instance ne peut être libérée que qd le thread se termine (sortie de la fonction Run). Sans ça imaginons que le GC passe alors que ton thread tourne encore et qu'il a besoin d'une des variables membres de la classe dans laquelle il s'exécute... Par contre une fois le thread terminé tout se passe normalement, comme le dit tomlev.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Citation Envoyé par Sphax Voir le message
    Salut,

    A mon avis ton instance ne peut être libérée que qd le thread se termine (sortie de la fonction Run). Sans ça imaginons que le GC passe alors que ton thread tourne encore et qu'il a besoin d'une des variables membres de la classe dans laquelle il s'exécute... Par contre une fois le thread terminé tout se passe normalement, comme le dit tomlev.
    Tout à fait, et c'est meme logique.

    Quand tu es dans la methode Run(), tu as implicitement une reference vers l'instance courante (pour simplifier, this) donc quand bien meme tu nullifies toutes les autres references fortes, le GC ne collectera pas la classe.

    Petit test pour s'en convaincre :

    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
        class Program
        {
            static void Main(string[] args)
            {
                ThreadClass t = new ThreadClass();
                t.RunExternal();
                //t.RunExternal();
     
                t = null;
                GC.Collect(2, GCCollectionMode.Forced);
            }
        }
     
        class ThreadClass
        {
            Thread t;
     
            public void RunExternal()
            {
                t = new Thread(AnotherClass.Idle);
                t.IsBackground = false;
                t.Start();
                while (!t.IsAlive) ;
            }
     
            public void RunInternal()
            {
                t = new Thread(Idle);
                t.IsBackground = false;
                t.Start();
                while (!t.IsAlive) ;
            }
     
            ~ThreadClass()
            {
                Trace.WriteLine("ThreadClass detruite !");
            }
     
            void Idle()
            {
                Thread.Sleep(10000);
            }
        }
     
        class AnotherClass
        {
            public static void Idle()
            {
                Thread.Sleep(10000);
            }
        }
    Dans le cas, ou la methode du thread est externe à la classe encapsulant le thread, alors cette derniere peut etre collecté (car la methode courante du thread ne refencera plus l'instance).

  5. #5
    Membre éclairé Avatar de TSalm
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 361
    Par défaut
    Citation Envoyé par SirJulio Voir le message
    Dans le cas, ou la methode du thread est externe à la classe encapsulant le thread, alors cette derniere peut etre collecté (car la methode courante du thread ne refencera plus l'instance).
    Mais si elle est externe, comment passer des données à cette méthode ?

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Salut,

    ParameterizedThreadStart ?

    mais de en pratique, est ce que la classe a reellement besoin d'etre collectée ? Car s'il est contient juste une reference vers un thread, et quelques données, c'est pas forcement une necessité. =p

  7. #7
    Membre éclairé Avatar de TSalm
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 361
    Par défaut
    Citation Envoyé par TSalm Voir le message
    Mais si elle est externe, comment passer des données à cette méthode ?
    Bon bon bon, petite correction...
    J'avais lu un peut trop rapidement...

    Effectivement, la classe est bien détruite uniquement après que le Thread qui en fait parti soit terminé.

    Le GC de dotnet est vraiment bien foutu !

    Merci à tous.

  8. #8
    Membre éclairé Avatar de TSalm
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 361
    Par défaut
    Citation Envoyé par SirJulio Voir le message
    Salut,

    ParameterizedThreadStart ?

    mais de en pratique, est ce que la classe a reellement besoin d'etre collectée ? Car s'il est contient juste une reference vers un thread, et quelques données, c'est pas forcement une necessité. =p
    Ce pgm est destiné à tourner en serveur...i lvaut mieux être propre je penses.

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par TSalm Voir le message
    Mais si elle est externe, comment passer des données à cette méthode ?
    En utilisant un delegate ParameterizedThreadStart

    EDIT: SirJulio a été plus rapide...

  10. #10
    Membre éclairé Avatar de TSalm
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 361
    Par défaut
    Citation Envoyé par tomlev Voir le message
    En utilisant un delegate ParameterizedThreadStart

    EDIT: SirJulio a été plus rapide...
    Merci à vous deux !

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

Discussions similaires

  1. Utiliser la class java.lang.Thread
    Par adilou1981 dans le forum GWT et Vaadin
    Réponses: 1
    Dernier message: 29/05/2009, 08h11
  2. Communication entre une classe et un thread
    Par cs_ntd dans le forum C#
    Réponses: 2
    Dernier message: 24/10/2008, 10h49
  3. partager l'instance d'une classe entre plusieurs thread ?
    Par contremaitre dans le forum Threads & Processus
    Réponses: 5
    Dernier message: 29/07/2008, 11h53
  4. Lancer deux classes avec les threads
    Par Invité1 dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 15/05/2008, 19h06
  5. classe dérivée de thread
    Par aaronw dans le forum Threads & Processus
    Réponses: 9
    Dernier message: 08/03/2006, 15h35

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