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 :

Problème de thread propriétaire


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Problème de thread propriétaire
    Bonjour,

    J'ai un fichier XAML Window1.xaml qui déclare un Rectangle dans un StackPanel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        x:Class="TestWPF.Window1"
        Title="Test" Width="500" Height="300" Background="#FFFFFFFF">
        <StackPanel>
                <Rectangle Name="rect" Fill="Black" Height="100" Width="100" />
        </StackPanel>
    </Window>
    J'ai également une classe Test dans laquelle je m'arrange pour récupérer l'instance de Window1, et qui définit une méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void methode(int w)
    {
         window.rect.Width = w;
    }
    Malheureusement, lorsque "methode()" est invoquée, une exception se produit dont le message est
    Le thread appelant ne peut pas accéder à cet objet parce qu'un autre thread en est propriétaire.
    J'ai tenté de binder Width sur une propriété, mais ça n'a pas été très concluant...

    Pourriez-vous me donner un coup de main ?

    Merci.

    Axel
    Dernière modification par Deepin ; 19/10/2009 à 16h27.

  2. #2
    Membre Expert
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Par défaut
    Regarde du côté de l'InvokeDispatcher.

    Car là, comme te le dis si bien le message d'erreur, tu tente de modifier dans un thread un composant graphique n'appartenant pas au même thread.

    Car la partie graphique est crée dans un thread à part.
    Blog - Articles - Framework

    MSDN vous aide, si si, alors n'hésitez pas à y faire un tour avant de poser une question.
    Ah, et n'oubliez pas, Google peut répondre à la majorité de vos questions.

  3. #3
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Par défaut
    Utilise le Dispatcher de ta fenêtre:
    http://msdn.microsoft.com/en-us/magazine/cc163328.aspx
    Les règles du forum
    Le trio magique : FAQ + Cours + fonction rechercher
    Mes articles
    Pas de questions par messages privés svp

    Software is never finished, only abandoned.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Merci pour vos réponse.

    J'ai essayé ceci, mais ça ne fonctionne pas.
    Le problème vient probablement du delegate, je ne comprends pas très bien comment utiliser ce concept...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public void methode(double value)
    {
        UpdateRect ur = delegate(double w)
        {
            window.rect.Width = w;
        };
        Dispatcher.Invoke(DispatcherPriority.Normal,
                          ur, value);
     
    }
     
    delegate void UpdateRect(double w);

  5. #5
    Invité
    Invité(e)
    Par défaut
    Plutôt que d'essayer d'accéder au Thread de l'UI depuis un autre Thread, ne serait-il pas possible de faire en sorte que la classe Test soit créée dans le même Thread que Window1 ?

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Par défaut
    Salut,

    Essaie avec ce code :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
          Application app = System.Windows.Application.Current;
          if (app != null)
            app.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Background,
                                       (Action)delegate {
              // Ton code
              window.rect.Width = w;
            });

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

Discussions similaires

  1. Problème de thread : Plus de ressources système
    Par OliverSleep dans le forum C++Builder
    Réponses: 17
    Dernier message: 07/02/2006, 15h35
  2. [VB.NET] Problème de Thread
    Par Sadneth dans le forum ASP.NET
    Réponses: 26
    Dernier message: 31/01/2006, 10h12
  3. Problème synchronisation threads
    Par Linio dans le forum Concurrence et multi-thread
    Réponses: 19
    Dernier message: 11/01/2006, 16h57
  4. [MFC] Problème de Threads + Timers
    Par Invité dans le forum MFC
    Réponses: 8
    Dernier message: 30/11/2005, 10h51
  5. [VC++6][DX9] Problème de thread lors d'un blit ...
    Par grandjouff dans le forum DirectX
    Réponses: 2
    Dernier message: 12/06/2003, 22h22

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