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 Presentation Foundation Discussion :

[C#][WPF] Communication entre Threads


Sujet :

Windows Presentation Foundation

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 61
    Points : 33
    Points
    33
    Par défaut [C#][WPF] Communication entre Threads
    Bonjour,

    J'ai un petit soucis avec mes threads.

    Pour faire simple, mon thread principal instancie un objet puis exécute une méthode de cet objet. Cette méthode lance un thread.

    Dans ce thread je souhaite modifier un booléen de mon objet (tout en laissant tourner le thread) cependant il me dis que je ne peut pas modifier cette variable car elle est détenue par un autre thread.

    Merci de m'éclairer

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    un controle ne peut être modifié que depuis le thread qui l'a créé
    pour les autres variables pas de soucis

    il faut donc depuis le thread revenir temporairement sur le thread principal pour modifier le controle puis continuer le thread

    voir délégué, this.invokerequired, this.invoke
    ou backgroundworker

  3. #3
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 317
    Points
    13 317
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    un controle ne peut être modifié que depuis le thread qui l'a créé
    Il n'a pas précisé qu'il instanciait un contrôle.

  4. #4
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 317
    Points
    13 317
    Par défaut
    Bonjour,

    Citation Envoyé par Floco Voir le message
    il me dis que je ne peut pas modifier cette variable car elle est détenue par un autre thread.
    Je doute très fort de ce message (un thread n'est jamais propriétaire d'une instance, le seul cas particulier étant les controles qui ne peuvent être modifiés que par leur thread de création, comme le mentionne Pol63 - vieille contrainte héritée de Win32).

    Quelle exception reçois tu exactement ?

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Il n'a pas précisé qu'il instanciait un contrôle.
    moi non plus ...
    un controle existant est forcément instancié à un moment ou à un autre ...


    Citation Envoyé par Bluedeep Voir le message
    vieille contrainte héritée de Win32
    une idée de pourquoi il y a la même contrainte en wpf qui n'utilise pas win32 ?


    Citation Envoyé par Bluedeep Voir le message
    Quelle exception reçois tu exactement ?
    je vote pour Illegal Cross Thread ^^

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 61
    Points : 33
    Points
    33
    Par défaut
    Voici exactement l'erreur que j'ai :

    InvalidOperationException : Le thread appelant ne peut pas accéder à cet objet parce qu'un autre thread en est propriétaire.
    @Pol63 : Qu'appels-tu un "contrôle" ? Car ma classe est "basique" elle n'hérite de rien, ce n'est pas un contrôle utilisateur.

    Merci pour vos réponses.

  7. #7
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    Dans ce cas je te propose de nous montrer ton bout de code

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    ce que j'appelle un controle, c'est une classe héritant de control (button, form, usercontrol etc...)

    mais le message d'erreur que tu as n'est pas celui qu'on a dans le cas d'un inter thread de control en windows forms

    es-tu sur wpf ?

  9. #9
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 317
    Points
    13 317
    Par défaut
    Citation Envoyé par Floco Voir le message
    Voici exactement l'erreur que j'ai :

    "InvalidOperationException : Le thread appelant ne peut pas accéder à cet objet parce qu'un autre thread en est propriétaire."

    @Pol63 : Qu'appels-tu un "contrôle" ? Car ma classe est "basique" elle n'hérite de rien, ce n'est pas un contrôle utilisateur.

    Merci pour vos réponses.
    Poste le code.

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 61
    Points : 33
    Points
    33
    Par défaut
    Oui, excusez moi, j'ai oublié de spécifier que je travaillais sur WPF.

    Pour ce qui est du code, ma classe est assez compliqué en fait, voilà l'équivalent en plus simple :


    Ma 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
     
    class MaClasse
    {
            public bool NewMessage;
            private Thread _listenThread;
     
            public MaClasse()
            {
                      _listenThread = new Thread(new ThreadStart(ListenServer));
                      _listenThread.Start();
            }
     
            private void ListenServer()
            {
                while (run)
                {
                        // Mes Traitement
                        NewMessage = true; // C'est ici que ça bug
                }
            }
    }

    Mon programme principale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MaClasse maclasse = new MaClasse();

  11. #11
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 317
    Points
    13 317
    Par défaut
    Etrange .......

    Essaye avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    lock
    {
    NewMessage = true;
    }

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 61
    Points : 33
    Points
    33
    Par défaut
    Même erreur avec le lock.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    si tu as fait un binding et que tu modifies depuis un autre thread une propriété de ta classe ca peut poser le même soucis que de modifier directement l'interface depuis un autre thread

  14. #14
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 317
    Points
    13 317
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    si tu as fait un binding et que tu modifies depuis un autre thread une propriété de ta classe ca peut poser le même soucis que de modifier directement l'interface depuis un autre thread
    Tiens, je n'avais pas pensé à ce scénario.

  15. #15
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 61
    Points : 33
    Points
    33
    Par défaut
    Je n'ai rien bindé mais mon bool est lié à une dependency property et mon programme principale c'est abonné à un évènement sur celle-ci.

    Code :

    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 static readonly DependencyProperty NewMessageProperty = DependencyProperty.Register("NewMessage", typeof(bool), typeof(MaClasse), new PropertyMetadata(false));
     
            public event PropertyChangedEventHandler NewMessageChanged;
     
            public void OnNewMessageChanged()
            {
                if (NewMessageChanged != null) NewMessageChanged(this, new PropertyChangedEventArgs("NewMessage"));
            }
     
            public bool NewMessage
            {
                get { return (bool)GetValue(NewMessageProperty); }
                set
                { 
                    SetValue(NewMessageProperty, value);
                    OnNewMessageChanged();
                }
            }
    Programme principale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maClasse.NewMessageChanged += new System.ComponentModel.PropertyChangedEventHandler(maClasse_NewMessageChanged);

    Désolé d'avoir oublié ce détail...

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    enfin bref la solution est de modifier le booléen sur le thread principal
    il faut invoker un délégué sur le dispatcher du thread principal
    (ou utiliser un backgroundworker au lieu d'un thread)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (!object.ReferenceEquals(System.Windows.Threading.Dispatcher.CurrentDispatcher, Application.Current.Dispatcher)) {
        Application.Current.Dispatcher.Invoke(new Action(() => varbool == false));
    } else {
        varbool = false;
    }
    (traduit du vb.net par un convertisseur)

  17. #17
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 61
    Points : 33
    Points
    33
    Par défaut
    Merci, je testerais ça dès ce soir.

  18. #18
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 61
    Points : 33
    Points
    33
    Par défaut
    Je viens de tester et ça marche nickel !!!

    Vraiment merci pour votre aide !

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

Discussions similaires

  1. [C#] Communication entre thread
    Par kekesilo dans le forum Windows Forms
    Réponses: 11
    Dernier message: 17/09/2007, 19h48
  2. [thread] communication entre threads
    Par untipy dans le forum Concurrence et multi-thread
    Réponses: 11
    Dernier message: 30/08/2007, 15h47
  3. Problème de communications entre threads
    Par maya09 dans le forum Windows
    Réponses: 1
    Dernier message: 22/02/2006, 22h18
  4. Communication entre thread
    Par JFPS Soft dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 03/02/2006, 17h38
  5. [c#][threading] communication entre threads
    Par orelero dans le forum C#
    Réponses: 6
    Dernier message: 02/01/2006, 00h42

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