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 :

Envoi d'évènement depuis un thread


Sujet :

C#

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 61
    Par défaut Envoi d'évènement depuis un thread
    J'ai ouvert un topic a cette adresse : http://www.developpez.net/forums/d97...-entre-thread/. Mais le problème a évolué donc je le redémarre ici :

    J'ai donc créé une classe similaire à "MyThreadHandle" comme présenter dans l'article http://emerica.developpez.com/csharp/threads/#LB. On y trouve une méthode DoWork() :

    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
     
        class MyThreadTraitementHandle
        {   
    /*
    code
    */
            public void DoWork()
            {
                try
                {
                    Runing = true;
                    m_process.loadData(ref m_arg);
     
                    m_process.enFréquence();
                    m_process.normalise();
                    m_process.buildAprox();
                }
                catch (Exception e)
                {
                    Runing = false;
                    throw new Exception("A marche pô!");
                }
                Runing = false;
            }
        }
    La méthode buildAprox() appelé depuis l'objet m_process génère des évennement que j'aimerai pouvoir récupérer soit directement depuis la classe MyThreadTraitementHandle, soit en accédant a l'objet m_process.

    J'ai essayé les deux cas (création de délégué dans le premier, puis capture des évènement issue de m_process puis le les réémet) et a chaque fois une exception
    La référence d'objet n'est pas définie à une instance d'un objet.
    est levé rattrapé par le bloc try, catch présent dans DoWork().

    Je n'y comprends plus rien...

    L'objectif des évènement est de me donné des infos sur l’avancement des calculs, des manière a les indiquer dans ma Form.

    Merci pour votre aide.

  2. #2
    Membre émérite Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    617
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 617
    Par défaut
    Si tu précisais un peu
    C'est quoi ton objet m_process ?
    Comment sont gérés les événements ?
    Comment tu d'abonnes aux évents de buildAprox
    etc...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 61
    Par défaut
    Ok, alors voila comment je m'abonne aux évènements de m_process dans MyThreadTraitementHandle :

    Dans la fonction initialisation appeler par le constructeur de MyThreadTraitementHandle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private void initialisation()
    {
        m_process = new Trait();
        m_arg = new Argument();
        Runing = false;
        m_process.monEventCoefEnCours += new EventCoefEnCOurs(process_monEventCoefEnCours);
        m_process.monEventCoefRelation += new EventCoefRelation(process_monEventCoefRelation);
        m_process.monEventIterEnCours += new EventIterEnCours(process_monEventIterEnCours);
    }
    Ensuite ces évènements sont récupérer comme suit dans MyThreadTraitementHandle (exemple pour EventCoefRelation) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public void process_monEventCoefRelation(double arg1)
    {
        OnCorrelationEventHandler(arg1);
    }
    Il sont donc réémit par MyThreadTraitementHandle. Voici comment il sont déclaré (exemple encore pour EventCoefRelation) :
    Dans le namespace se trouve les délégué comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public delegate void CorrelationEventHandler(double _r);
    puis dans la classe MyThreadTraitementHandle on trouve :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public event CorrelationEventHandler OnCorrelationEventHandler;
    Je ne me suis pas encore inscrit aux évènements de MyThreadTraitementHandle. Cette classe est utilisé comme ceci depuis ma Form :

    Variable de ma Form :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private Thread myThreadCalcCoef; 
    private MyThreadTraitementHandle ProcessWorker = new MyThreadTraitementHandle();
    Dans le constructeur de ma form :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private Thread myThreadCalcCoef; myThreadCalcCoef = new Thread(new ThreadStart(ProcessWorker.DoWork));
    Après une execution pas à pas du programme le problème survient lors que OnCorrelationEventHandler(arg1); est appelé depuis MyThreadTraitementHandle.

    Voila si cela peu vous éclairer, moi ça m’échappe complètement...

  4. #4
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    Bonjour,

    Il faut tester pour savoir si OnCorrelationEventHandler est null !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void process_monEventCoefRelation(double arg1)
    {
        if(OnCorrelationEventHandler != null)
           OnCorrelationEventHandler(arg1);
    }

  5. #5
    Membre émérite Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    617
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 617
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void process_monEventCoefRelation(double arg1)
    {
        OnCorrelationEventHandler(arg1);
    }
    Ca, tu ne peux pas le faire !!!
    Tu es obligé de tester si ton event n'est pas null.
    Si personne ne s'est abonné à OnCorrelationEventHandler alors il sera null...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void process_monEventCoefRelation(double arg1)
    {
      if (OnCorrelationEventHandler != null)
      {
        OnCorrelationEventHandler(arg1);
      }
    }
    Ouaip ! on se croise à ce que je vois....

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 61
    Par défaut
    Donc si je comprend bien il faut que je vérifie si au moins un objet est inscrit a cette évènement ? Ceci en vérifiant s'il est null ou non ? Enfin j'ai déjà utilisé des évènements auparavant, c'est la première fois que j'ai ce problème...

    En tout cas, quoi qu'il en soit ça fonctionne, merci pour votre aide.

Discussions similaires

  1. Générer un évènement depuis un Thread
    Par bill_3737 dans le forum Concurrence et multi-thread
    Réponses: 5
    Dernier message: 11/03/2013, 11h50
  2. Envoie de primitive et texture depuis un thread
    Par yann458 dans le forum OpenGL
    Réponses: 2
    Dernier message: 18/12/2011, 20h41
  3. Réponses: 9
    Dernier message: 24/02/2010, 13h34
  4. Réponses: 8
    Dernier message: 29/06/2008, 23h47
  5. envoi de sms depuis son pc en passant par un mobile
    Par cyberxper dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 11/07/2005, 11h25

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