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 :

[thread, static]petites précisions sur le multithreading?


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2006
    Messages : 26
    Points : 20
    Points
    20
    Par défaut [thread, static]petites précisions sur le multithreading?
    Bonjour,

    Je développe une application industrielle (framwork .Net 1.1 & visual studio 2003) et je rencontre un problème avec mes threads.

    Voici grossièrement le fonctionnement souhaité :
    j'ai une classe "camera" que j'instancie 3x (camera1, camera2 & camera3). Dans la définition de la classe camera j'ai une fonction membre qui doit être executé dans un thread lors de la création de l'objet, mais je voudrais créer ce thread qu'une seule fois. Je l'ai donc déclaré en static (ainsi que toutes les variables dont le thread à besoin).

    Le problème que je rencontre est que lors du débuggage je vois 3 threads tourner. La question que je me pose (et que je vous soumets ) est : l'attribut statique fontionne t'il sur les threads de la même façon que sur les variables ? Ou alors je m'y prends mal en instanciant et demarrant mon thread dans le constructeur de ma classe et il faut que je le fasse par une methode publique appelé postérieurement ?

    Merci d'avance

  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 : 47
    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
    Pour te répondre le plus simple serait de voir un peu de code, l'ossature globale, de manière à bien comprendre ce que tu fais. Parce que comme ca, ce n'est pas facile de voir ^^

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2006
    Messages : 26
    Points : 20
    Points
    20
    Par défaut
    Structure de ma classe camera
    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
     
    public class camera
    {
     private static Thread gestionGrafcet;
     ...
     
     private static void threadGrafcet()
     {
       ...
     }
     
     ...
     public camera()
     {
       camera.gestionGrafcet = new Thread(threadGrafcet);
       camera.gestionGrafcet.Start();
     }
    }
    classe appelante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
    camera maCamera1 = new camera();
    camera maCamera2 = new camera();
    camera maCamera3 = new camera();
    ...
    J'espère que cela sera plus compréhensible que mon explication précédente (déja pas très claire pour moi :p )

    Avec ce code je me retrouve avec 3 threads "threadGrafcet" alors qu'en passant le thread en static je pensais en obtenir qu'un seul.

  4. #4
    Membre actif Avatar de scifire
    Inscrit en
    Juillet 2004
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 226
    Points : 245
    Points
    245
    Par défaut
    Salut.
    A chaque fois que tu appelles le constructeur tu crees un nouveau Thread et la reference est assigne a la variable gestionGrafcet. Alors dans ton exemple tu finis par creer trois threads et seulement la derniere reference est gardee. Les deux premiers threads tournent mais tu ne peux rien faire avec car tu n'as pas des references sur eux
    Je te propose d'utiliser la classe suivante
    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
        public class Camera
        {
            private static object keyLock = new object();
            private static Thread gestionGrafcet = null;
     
            private static void threadGrafcet()
            {
     
            }
     
            public Camera()
            {
                lock (keyLock)
                {
                    if (gestionGrafcet == null)
                    {
                        gestionGrafcet = new Thread(threadGrafcet);
                        gestionGrafcet.Start();
                    }
                }
            }
        }


    Bon courage

  5. #5
    Membre actif Avatar de scifire
    Inscrit en
    Juillet 2004
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 226
    Points : 245
    Points
    245
    Par défaut
    J'ai pense un petit peu et si moi j'etais a ta place je vais creer un seul gestionnaire(singleton) qui peut gerer un nombre variable de cameras. Il est possible d'ajouter/supprimer des cameras; arreter/redemarrer le gestionnaire.
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    public class GestionGrafcet
    {
        private Thread task = null;
        private volatile bool running = false;
     
        private static readonly object keyLock = new object();
        private static GestionGrafcet instance = null;
        public static GestionGrafcet Instance
        {
            get
            {
                lock (keyLock)
                {
                    if (instance == null)
                    {
                        instance = new GestionGrafcet();
                    }
                }
                return instance;
            }
        }
     
        private GestionGrafcet()
        {
            this.cameras = new List<Camera>();
        }
     
        public void Start()
        {
            if (!running)
            {
                running = !running;
     
                task = new Thread(threadGrafcet);
                task.Start();
            }
        }
     
        public void Stop()
        {
            if (running)
            {
                running = !running;
     
                task.Join();
            }
        }
     
        private void threadGrafcet()
        {
            while (running)
            {
                foreach (Camera c in this.Cameras)
                {
                    // ...
                }
            }
        }
     
        private List<Camera> cameras;
     
        public List<Camera> Cameras
        {
            get { return cameras; }
            set { cameras = value; }
        }
    }
     
    public class Camera
    {
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
                Camera c = new Camera();
                Camera c2 = new Camera();
     
                GestionGrafcet gestion = GestionGrafcet.Instance;
                gestion.Start();
     
                gestion.Cameras.Add(c);
                gestion.Cameras.Add(c2);
     
                // ...
                gestion.Cameras.Remove(c);
     
                gestion.Stop();
    Tu peux bien sur modifier ce code pour mieux correspondre a tes besoins.

    A+

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2006
    Messages : 26
    Points : 20
    Points
    20
    Par défaut
    Merci, en effet ton code me semble plus cohérent que le mien.

    Merci encore

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

Discussions similaires

  1. petite précision sur les foncteurs
    Par DEVfan dans le forum C++
    Réponses: 6
    Dernier message: 28/03/2008, 01h22
  2. Réponses: 2
    Dernier message: 26/10/2007, 16h48
  3. petite précision sur gtk_main_quit()
    Par bit_o dans le forum GTK+ avec C & C++
    Réponses: 4
    Dernier message: 19/04/2007, 22h20
  4. Petite précision sur les pointeurs
    Par Fonzy007 dans le forum C
    Réponses: 2
    Dernier message: 07/12/2006, 12h25
  5. [XPath] petite précision sur type de syntaxe
    Par Royd938 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 15/06/2006, 13h13

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