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 :

[MultiThread] Compréhension AutoresetEvent


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 18
    Par défaut [MultiThread] Compréhension AutoresetEvent
    Bonjour à tous,
    En m'essayant au multithreading, je suis tombé sur un comportement que je n'arrive pas bien à appréhender...

    Bon voila le contexte :

    Un appli désire envoyer des message sur vers une librairie multithreadée.
    Lors de la réception de ce message, celui-ci est mis dans un objet de type queue. un autoresetevent est alors setté pour signaler le nouvel élément ajouter. Normalement cela voudrait dire que le thread sensé consommer les messages et qui attend les évenements à partir de la classe WaitHandle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(WaitHandle.WaitAny(syncEvent.Events) == 0)
    Le code sera plus parlant que mon discours...
    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
     
    //Pour la classe recevant les messages
     
    private static SyncEvent m_syncEvent = new SyncEvent();
            private static Queue<string> m_queue = new Queue<string>();
            private static MessageConsumer m_Consumer;
            private static Thread m_ThreadConsumer;
     
    //Pour démarrer le thread consommateur
     public static void StartListening()
            {
                m_Consumer = new MessageConsumer(m_queue, m_syncEvent);
                m_ThreadConsumer = new Thread(m_Consumer.ThreadRun);
                m_ThreadConsumer.Name = "Thread Consommateur de Message";
                m_ThreadConsumer.Start();
     
            }
     
    //Pour stopper le thread consommateur de message
            public static void StopListening()
            {
                m_syncEvent.ExitThreadEvent.Set();
                m_ThreadConsumer.Join();
            }
     
     public static void Add(string strMessage)
            {
                //while (!m_syncEvent.ExitThreadEvent.WaitOne(0, false))
                lock (((ICollection)m_queue).SyncRoot)
                {
                   //On ajoute le message à la queue commune au deux thread                
                    m_queue.Enqueue(strMessage);
                    //On notifie le nouvel évement
                    m_syncEvent.NewItemEvent.Set();
     
                }
            }
     
     
    //Du coté de la classe MessageConsumer
    //Méthode du thread
     
     internal void ThreadRun()
            {
                int count = 0;
                //m_syncEvent est l'objet commun contenant Events
                while (WaitHandle.WaitAny(m_syncEvent.Events) == 0)
                {
     
                            //Traitement du message : Reflexion - plug in - DB??
                            //Traitement du message
                    lock (((ICollection)m_queue).SyncRoot)
                    {
     
                        while(m_queue.Count > 0)
                        {
     
                            string strMessage = m_queue.Dequeue();
                            //Traitement du message   
                        }
                    }
                           //VAUT 1 après passage dans le while 
                    count++;
                }
    }
    Dans la méthode main de mon appli je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     Messages.MessageLog.StartListening();
                for (int i = 0; i < 200; i++)
                {
                    Messages.MessageLog.Add("Count " + i);
                }
     
                Messages.MessageLog.StopListening();
    Ce que je n'arrive pas à comprendre c est que count (dans threadRun()) vaut 1 après passage du while dans la méthode threadRun, alors que le Message peut etre notifié plusieurs fois.

    Est ce que le fait de setter l'autoreset plusieurs fois de suite dans le meme thread (main ici) agit comme un autoreset et est ce que en général, il faut developper en pensant de cette manière ou alors y-a-til une pile d'appel à la méthode set qui permettrait de gérer signaler a WaitHandle.WaitAny le nombre exact de fois qu'a été setter l'autoressetEvent?

    D'avance je vous remercie pour vos eclaircissement

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    j'ai pas bein lu mais les resetevent servent à arreter un thread jusqu'à qu'on lui dise de repartir

    et vu que ce que tu dis vouloir faire, moi j'aurais plutot fait qu'au moment ou tu recois un objet, tu le mets dans l'objet queue et si le thread n'est en cours tu le demarre
    comme ca tant qu'il y a rien à faire, t'as pas de thread et quand ca revient tu demarres le thread
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. [FLASH MX] Prob de compréhension des bouttons
    Par WriteLN dans le forum Flash
    Réponses: 13
    Dernier message: 16/10/2003, 17h01
  2. [Win32]App multithread
    Par billyboy dans le forum Windows
    Réponses: 5
    Dernier message: 25/09/2003, 09h57
  3. onclipevent (problème de compréhension)
    Par stephane eyskens dans le forum Flash
    Réponses: 8
    Dernier message: 24/09/2003, 15h09
  4. Problème de compréhension des ensembles
    Par Cornell dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2003, 22h07
  5. Multithreading sous HP Ux 11
    Par pykoon dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 18/10/2002, 23h36

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