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

Windows Forms Discussion :

Thread , Délégué , Invoke


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 371
    Points : 65
    Points
    65
    Par défaut Thread , Délégué , Invoke
    Bonjour,

    Voila j'ai un petit probleme, le voici :

    J'ai un thread d'une instance appellé B par exemple qui appelle un evenement de ma Windows Form appellée A grace aux délégués jusque là pas de problème ...

    Donc pour modifier des propriétés de l'interface j'ai fais un this.invoke() qui appelle une methode , parfait ca marche!

    Dans cet évenement de la classe A j'appelle une methode d'une instance C et cette derniere recupere un attribut de l'instance B mais il n'a pas la meme valeur qu'avant l'appel de l'evenement ....

    Quelqu'un pourrais me filé un coup de pouce ?

    Merci par avance

  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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    pas tout compris... tu pourrais montrer des extraits du code, qu'on y voit plus clair ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 371
    Points : 65
    Points
    65
    Par défaut
    Daccord

    Pour le thread ,

    voici la 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    class A : ClsThread
    { 
     
            public delegate void Detection();
            public event Detection OnDetecte;
     
    protected override void Execute()
            {
                do
                {
                    m_S = new S(); 
     
                   if ( ... ) 
                   {      
                                OnDetecte(); // on appelle un evenement de l'IHM  
                                Arreter();// on arrete le thread 
                    }
                                            }
     
                } while ( ... );
            }
     
            public S get_S()
            {
     
                return m_S;
            }
     
    }
    IHM

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            private delegate void DetectionIHM(); // délégué 
            private DetectionIHM ModeDegrade;
    Constructeur de la form :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    m_D = new D();
     
    if ( ... )
    {
              m_A = m_D.get_A();
              m_A.OnDetecte += new A.Detection (On_Detection);
    }
    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 void On_Detection()
            {
                this.Invoke(ModeDegrade_ModifIHM); 
     
     
                if ( m_D.Creer_C() )   
                {
                    m_C = m_D.get_C();
                    m_C.OnDetecte += new C.Detection(On_Deconnexion);
     
                    m_C.Demarrer();
                }
            }
    classe D :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public bool Creer_C()
            {
                bool bResultat = true;
     
     
                    m_C = new C();
                    m_C.set_S( m_A.get_S() ); // on recupere ici la mauvaise
    // valeur alors qu'avant l'appel de l'evenement de IHM par A la valleur est 
    // bonne donc je suppose que j'ai oublié de faire un truc ...
                }
                if ( ... ) bResultat = false;
                return bResultat; 
            }
    Voila j'espere que ca t'aidera un peu

  4. #4
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    get_S ça renvoie le m_S que tu affectes dans la boucle du premier morceau de code ? dans ce cas c'est normal que sa valeur change puisque le thread continue pendant ce temps...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 371
    Points : 65
    Points
    65
    Par défaut
    Oui cest bien cette instance ... Tu veux dire que le thread continue de tourner meme s'il rentre dans l'evenement de IHM a la detection ?

    Je pensais que le thread passait a linstruction suivante une fois levenement terminé ... enfin cest ce que j'ai observé au debug

    et apres l'instruction de levenement quand je suis en debug je vois que ma variable a la valeur que je souhaite meme le get a l'interieur de l'evenement ne me retourne pas cette valeur mais une autre ...

    Comment faire alors ?

  6. #6
    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 : 46
    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
    Citation Envoyé par tomlev Voir le message
    get_S ça renvoie le m_S que tu affectes dans la boucle du premier morceau de code ? dans ce cas c'est normal que sa valeur change puisque le thread continue pendant ce temps...
    C'est ce que j'ai cru au début aussi, mais une fois l'événement déclenché il appelle une méthode Arreter pour stopper le thread. On peut donc supposer que l'on sort de la boucle à ce moment et que la variable n'est pas réaffectée. Tu n'affectes pas la variable ailleurs dans le code ? A moins qu'il y ai plusieurs threads, mais tu n'en fais pas mention.

    Au passage, ce serait mieux de faire un break pour sortir de la boucle while et de mettre l'éventuel traitement de fin après la boucle en question. A voir dans le contexte.

    Sinon tu devrais revoir tes événements et utiliser les EventHandler génériques si tu utilises le framework 2.0 minimum. Regarde aussi la façon de les déclencher, car la tu te taperas de belles exceptions s'il n'y a pas d'abonnements. Merci la MSDN pour ça
    Pas de questions techniques par MP

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 371
    Points : 65
    Points
    65
    Par défaut
    L'instance C est un thread , cependant il n'est pas encore lancé quand dans Creer_C la methode je recupere l'instance S ...

    L'instance S n'est modifiée nulle part d'autre ... de plus avant l'appel de l'evenement la valeur de S est bonne ... , je rentre dans l'evenement là elle est invalide et apres l'instruction de l'evenement elle est valide ....

    Je ne comprend pas pourquoi je recupere la mauvaise valeur mais vraiment pas pourquoi

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 371
    Points : 65
    Points
    65
    Par défaut
    Me suis-je mal exprimé ?

Discussions similaires

  1. Problème avec Thread et invoke pour maj une textbox
    Par drichnifu dans le forum VB.NET
    Réponses: 3
    Dernier message: 30/03/2012, 17h36
  2. Windows et Multi-Threading - Invoke
    Par zi_omnislasher dans le forum Windows
    Réponses: 1
    Dernier message: 26/10/2007, 10h13
  3. [C#][Thread][Invoke] petit problème de delegate
    Par clinic dans le forum Général Dotnet
    Réponses: 3
    Dernier message: 22/06/2007, 11h38
  4. Thread et Invoke...
    Par SpecialCharacter dans le forum Windows Forms
    Réponses: 1
    Dernier message: 05/05/2007, 21h58
  5. [VB.NET 1.1] [Thread] Méthode invoke
    Par toniolol dans le forum Windows Forms
    Réponses: 5
    Dernier message: 15/02/2006, 16h04

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