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 et de dependency property


Sujet :

Windows Presentation Foundation

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 32
    Par défaut Problème de thread et de dependency property
    Bonjour.

    Dans le cadre d'un développement, j'ai créé un petit éditeur d'animation.
    Le fonctionnement est simple : une classe animation qui contient les frames et la durée de chacune d'entre elle, et une classe player.

    Cette dernière incorpore pas mal de dependency property (notamment sur la frame actuelle, le temps écoulé, le temps total de l'animation).

    La "lecture" de l'animation se fait grace a une animation et un storyboard, qui fait varier une dependency property de 0 a la valeur contenue dans celle contenant le temps total, et faisant varier au passage les informations de frame.

    L'éditeur marche bien, il ne comporte pas de bug (connus).

    Le soucis, c'est que j'ai voulu intégrer ceci dans un petit jeu, et là je reçois assez souvent une erreur de type invalidOperation, qui me dit en gros que je ne peux modifier telle propriété car l'opération ne se déroule pas dans le thread qui l'a créé ...

    Le plus étonnant, c'est que dans certaines circonstances, le morceau de code fautif ne renvoie aucune erreur !

    Je sais que dis comme cela, ça risque de ne pas beaucoup vous éclairer, mais peut être avez vous déjà eu ce type de problèmes avec des dependecy et que vous avez une idée d'où cela peut venir ...

    En espérant que quelqu'un pourra me dépanner,

    Cordialement,

    KiTe.

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Lorsque tu es dans un thread à part, il faut que tu vérifies si tu es dans le Thread de l'IHM (méthode CheckAccess). Si oui, alors tu appelles ton code sinon, tu passes par le Dispatcher pour appeler ton code.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 32
    Par défaut
    serait-il possible d'avoir un exemple ?
    je n'ai jamais touché a tout ça, je n'ai pas encore beaucoup d'expérience en WPF =S.

    Merci d'avance !

    Cordialement,

    KiTe

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 32
    Par défaut
    En me basant sur les informations que tu m'as donné, et quelques recherches complémentaires, j'ai réussi a forger petit a petit une solution à mon problème.

    La voici :

    1 : déclaration d'un delegate pour ma fonction qui buguait :

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
      delegate void PlayAnimDelegate(clsAnimation anim);
    2 : vérification et appel avec via le CheckAccess et le dispatcher :

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      if (attaqueAnimPlayer.CheckAccess())
        attaqueAnimPlayer.PlayAnim(_colAnim[_GameCartes[IDCarte].AnimID]);
      else
      {
        attaqueAnimPlayer.Dispatcher.BeginInvoke(Delegate.CreateDelegate(typeof(PlayAnimDelegate), attaqueAnimPlayer, "PlayAnim"), _colAnim[_GameCartes[IDCarte].AnimID]);
      }


    Bien que cela marche parfaitement, je n'ai compris que vaguement ce qui se passe dans ce morceau de code.

    Il me semble que le dispatcher réaffecte l'appel de la fonction au thread principal du attaqueAnimPlayer?

    J'ai vraiment du mal a saisir ce genre de chose ...

    Si quelqu'un pouvait m'éclairer ce serait gentil !

    Ceci dit, comme la solution marche, je valide le post.
    Merci


    KiTe.

  5. #5
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    En fait, avec CheckAccess, tu vérifies si tu es dans le Thread de l'UI (WPF est composé de 2 Thread principaux: celui de l'UI et celui du rendering, qui tourne en background).

    Si tu es dans ce thread (UI), alors tu peux manipuler directement les contrôles graphiques. Sinon, cela veut dire que tu es dans un autre thread et il faut que tu trouves le moyen de repasser dans le thread UI pour manipuler tes contrôles: c'est à cela que sert le Dispatcher

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 32
    Par défaut
    hmm ok.

    mais là où je ne comprend pas, c'est que la classe qui me générait l'erreur n'avait aucun lien direct avec l'UI

  7. #7
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Oui mais elle faisait sans doute appel, à un moment donné, à un élément de l'interface.

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 32
    Par défaut
    en fait elle générait des event auxquels étaient abonné mon UI, mais c'est bien avant l'appel de ces events que le code plantait ...

    Mais ça pourrait expliquer en effet.

    En tout cas merci, ça marche ^^

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

Discussions similaires

  1. [Débutant] WPF Thread UI sur dependency property change
    Par kraigoun dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 10/08/2013, 15h41
  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