Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C#/WPF] Problème de threads

Sujet résolu
    30 juin 2011 à 10:47:00

    Bonjour à tous,

    Je viens vers vous avec un petit problème de threads sur les bras. Voici mon erreur :
    Le thread appelant ne peut pas accéder à cet objet parce qu'un autre thread en est propriétaire.

    Pour faire simple, j'ai une MainWindow avec un TextBox que je veux mofidier au bout d'un certain temps (par la suite il sera modifier selon les valeurs prises dans une base de données dynamique).
    J'utilise donc un timer qui appelle une méthode qui modifie le texte. Cependant j'obtiens l'erreur lorsque je suis dans cette méthode.

    Voilà j'espère que j'ai été clair !
    • Partager sur Facebook
    • Partager sur Twitter
      30 juin 2011 à 11:34:12

      Erreur classique....Recherche un peu plus sur le net, tu trouveras forcément la solution tellement cette erreur est courante.

      • Partager sur Facebook
      • Partager sur Twitter
        30 juin 2011 à 11:34:59

        Il ne faut pas passer par un délégué pour accéder à la modification du TextBox ?
        • Partager sur Facebook
        • Partager sur Twitter
          30 juin 2011 à 11:39:10

          Je revenais pour dire que j'avais trouvé une solution avec le DispatcherTimer au lieu d'un Timer classique et du coup je n'ai plus aucun problème !

          Merci pour vos réponses mais au final pas besoin de délégué !!
          • Partager sur Facebook
          • Partager sur Twitter
            30 juin 2011 à 11:42:01

            Citation : Aureus05

            Il ne faut pas passer par un délégué pour accéder à la modification du TextBox ?


            C'est une idée souvent véhiculée, mais fausse. Appeler soi-même un delegate a exactement le même effet qu'exécuter directement la fonction qu'il désigne. Ce qu'il faut faire c'est appeler le Dispatcher et lui indiquer le code à exécuter dans le thread principal (au moyen d'un delegate), pas simplement "passer par un delegate".

            @silver9: c'est bien une question qui revient très souvent, et il y a plusieurs manières de régler le problème - la meilleure selon moi étant effectivement d'utiliser un DispatcherTimer au lieu d'un Timer ;)
            • Partager sur Facebook
            • Partager sur Twitter
              30 juin 2011 à 13:07:54

              Citation : Orwell

              Citation : Aureus05

              Il ne faut pas passer par un délégué pour accéder à la modification du TextBox ?


              C'est une idée souvent véhiculée, mais fausse. Appeler soi-même un delegate a exactement le même effet qu'exécuter directement la fonction qu'il désigne. Ce qu'il faut faire c'est appeler le Dispatcher et lui indiquer le code à exécuter dans le thread principal (au moyen d'un delegate), pas simplement "passer par un delegate".



              Hum, petite question. Faire du Invoke sur un contrôle, c'Est ce que tu appelle "passé par un délégué?". En WinForm, je ne connais pas d'autre façon de modifier un contrôle à partir d'un autre Thread :-°
              • Partager sur Facebook
              • Partager sur Twitter
                30 juin 2011 à 14:19:25

                En WinForms la notion de Dispatcher est effectivement planquée derrière la méthode Invoke() des contrôles utilisateur, donc c'est bien la bonne façon de faire. ;)

                Mon but était d'insister sur le fait que dans ce code-ci par exemple:

                void UpdateControl()
                {
                    someTextBox.Text = "foo";
                }
                
                void SomeMethodInAnotherThread()
                {
                    Delegate myDelegate = (Action)UpdateControl;
                    myDelegate.DynamicInvoke();
                }
                

                On passe par un delegate pour exécuter le code qui modifie les contrôles mais ça ne résout en rien le problème, puisque invoquer soi-même le delegate revient à exécuter la méthode qu'il désigne. :-°

                Par contre on pourrait écrire
                void SomeMethodInAnotherThread()
                {
                    Delegate myDelegate = (Action)UpdateControl;
                    someTextBox.Invoke(myDelegate);
                }
                

                où l'on utilise effectivement un delegate, mais tout l'intérêt se trouve dans l'appel à Invoke() et pas juste dans l'utilisation d'un delegate comme on pourrait le croire.
                • Partager sur Facebook
                • Partager sur Twitter

                [C#/WPF] Problème de threads

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown