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 et Events


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 8
    Par défaut Thread et Events
    Bonjour voici mon problème

    j'ai ce bout de code (simplifié)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    main ()
    {
      Thread monThread = new Thread (new ThreadStart(MaMethodeDuThread ));
      monThread.Start ();
      monThread.Join ();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void MaMethodeDuThread ()
    {
      Objet monObjet = new Objet ();
      Objet.ChargementCompleted += new EventHandler   (MethodeChargementCompeted);
      Objet.ChargementAsynchrone ();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void MethodeChargementCompeted(object sender, EventArgs e)
    {
    //arrive jamais la
    }
    Lorsque j'utilise chargementAsynchrone sans passer par un thread, lorsque le chargement est terminé je passe bien dans MethodeChargementCompeted, mais des que je mets en place le lancement a partir d'un thread, je ne passe plus dans MethodeChargementCompeted.

    quelqu'un aurais t'il une idée du pourquoi ?

    merci d'avance

    arnauld

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Par défaut
    bonjour

    Je suppose que ta méthode void MethodeChargementCompeted(object sender, EventArgs e) se situe dans la classe appelant le thread.

    Il ne peut y avoir de communication d'un thread vers un autre sans prendre quelque precaution dans la façon de creer le thread.

    Normalement ce que je fait est que je creer une classe pour le thread permettant de passer dans le constructeur les variables, event, delegate a partagé entre mes deux Threads et une fonction run
    dans ton cas quelque chose comme cà

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public  class ThreadArgs
        { 
     
     public void Run()
    {
    Objet monObjet = new Objet ();
      Objet.ChargementCompleted += new EventHandler   (MethodeChargementCompeted);
      Objet.ChargementAsynchrone ();
    }
    void MethodeChargementCompeted(object sender, EventArgs e)
    {
    //arrive jamais la
    }
    }
    tu remaques que tu t'abonne a l'evenement dans le thread.

    et tu le lance par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    main ()
    {
    ThreadArgs threadArgs = new ThreadArgs();
      Thread monThread = new Thread (new ThreadStart(threadArgs.Run));
      monThread.Start ();
     
    ....
      monThread.Join ();
    }
    cordialement

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 8
    Par défaut
    Non malheureusement, je ne passe toujours pas dans dans mon chargementCompleted

    si tu as une autre idée

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    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 197
    Par défaut
    une instance de classe non graphique n'appartient pas à un thread
    le soucis possible c'est quand un thread qui n'est pas le créateur d'un controle tente de le modifier
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 147
    Par défaut
    Essaye la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Thread monThread = new Thread (new ThreadStart(maMethodeDuthread));
    cordialement

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 8
    Par défaut
    mauvaise recopie, c'etait bien sur fait merci, j'ai modifié mon premier poste

  7. #7
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    Normal que tu n'aies jamais le completed.
    Ce que donne exécution du thread :
    * [th1] Instanciation du Thread
    * [th1] Démarrage du Thread
    * [th2] Création de l'abonnement sur événement dans la méthode ciblé dans ThreadStart
    * [th1] Attente sur Join (non déterministe, peut se passer avant la ligne précédente)
    * [th2] Appel méthode asynchrone
    * [th2] Fin de méthode, on quitte
    * [th1] Thread terminé, on passe à après le join
    Et pendant ce temps là ton processus asynchrone de chargement mouline, mais arrive trop tard.

    dans ta fonction principale fais un truc du genre

    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
     
    volatile bool done = false;
    main ()
    {
      Thread monThread = new Thread (new ThreadStart(MaMethodeDuThread ));
      monThread.Start ();
     
    while(done == false) //perso j'ajoute un compteur en plus en général pour éviter les boucles infinies
    {
      Thread.Sleep(50); //Attente pour vérifier que le completed est effectué
    }
     //Chargement fait, on continue
    }
     
    private OnCompleted()
    {
       done = true;
     
    //Traitement
    }
    ET si tu veux quelque chose de plus propre, regarde l'implémentation de pattern BeginInvoke/EndInvoke, mais ce que je te propose devrait régler ton souci.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 8
    Par défaut
    J'ai un début de réponse

    quand je retire la ligne je rentre bien dans ma MethodeChargementCompeted

    la je comprend plus trop

    PS : merci Arnard, mais apres avoir tester ta méthode, je ne passe toujours pas dans ma méthode

  9. #9
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    humm, la j'en perds mon latin... Si tu retires ton join, logiquement tu arrives à la fin du main, et donc tu quittes l'application. Peux-tu m'éclairer sur ce point ?

    Et aussi, à quoi correspond le traitement asynchrone derrière ? Il faut combien de temps pour que la requête asynchrone soit accomplie ?

    Edit : peux-tu afficher l'id du thread dans l'appel asynchrone et la méthode completed quand l'appel fonctionne ? Merci

  10. #10
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Ce que tu essaies de faire ressemble fortement à un composant qui existe déjà : BackGroundWorker.
    Lui aussi exécute une méthode donnée, et lève un événement quand la tâche est finie. Il se charge tout seul de lever l'event dans le bon thread, puisqu'il est principalement conçu pour être facile à utiliser avec le code d'UI.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 8
    Par défaut
    Le main était pour l'exemple effectivement la méthode est une méthode lancé a partir d'un bouton donc l'application continu bien de tourner.

    le traitement asynchrone est méthode d'un web service bing, la durée est inférieur a 1s.

    d'après ce que j'ai compris:

    Thread principal : lance le thread 2
    Thread 2 : exécute la méthode MaMethodeDuThread
    Thread 2 : s'abonne a l'events completed
    Thread 2 : lance le traitement asynchrone
    Thread 2 : se ferme
    Thread principal : catch l'evenement completed
    alors que l'abonnement a bien été fait dans le thread 2
    Thread principal : lance un Thread de travail
    Thread de travail : exécute la méthode MethodeChargementCompeted

    voili

  12. #12
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    Citation Envoyé par arnauld Voir le message
    Thread principal : catch l'evenement completed
    alors que l'abonnement a bien été fait dans le thread 2
    Thread principal : lance un Thread de travail
    Thread de travail : exécute la méthode MethodeChargementCompeted

    voili
    Pour ce dernier passage, il faudrait tracer l'identifiant de chaque thread du fonctionnel afin d'en être sûr !! Mais logiquement
    Thread principal : lance un Thread de travail
    n'a pas lieu, le thread auquel tu fais allusion est soit :
    * le thread qui realise l'appel asynchrone en interne si le invoke sur l'événement est synchrone
    * un thread X si le invoke sur l'événement est asynchrone (en espérant être clair !)

Discussions similaires

  1. Mutex, thread et event
    Par mackhdo dans le forum Framework .NET
    Réponses: 15
    Dernier message: 09/12/2010, 15h02
  2. Simulation de thread pour Event.COMPLETE
    Par +Guilhem dans le forum ActionScript 3
    Réponses: 3
    Dernier message: 10/03/2010, 12h25
  3. [threading]Mon event.wait() bloque.
    Par orime dans le forum Général Python
    Réponses: 0
    Dernier message: 10/02/2010, 21h22
  4. [C#] Thread et events dans une form
    Par farfadet dans le forum Windows Forms
    Réponses: 3
    Dernier message: 21/12/2006, 18h50
  5. [C#]Thread, event/delegate et Form
    Par doccpu dans le forum Windows Forms
    Réponses: 28
    Dernier message: 01/08/2005, 18h35

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