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 rafraichissement d'une uniformGrid


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2011
    Messages : 22
    Par défaut Problème rafraichissement d'une uniformGrid
    Bonjour!

    je suis actuellement en train de coder un puissance4 en wpf.
    Lorsque l'utilisateur clique sur un des boutons pour lancer un jeton, un évènement se déclenche.

    Dans celui ci, le "trou" correspondant est "colorié" de la couleur du joueur; ensuite l'appel à la méthode de l'intelligence artificielle est lancé, et même démarche, le "trou" correspondant est "colorié" avec la couleur du computer.

    Tout ceci se déroule sans problème, seulement j'aimerais bien effectuer une pause entre le coup du joueur et celui du pc (afin que le joueur puisse mieux visionner le coup de l'ordinateur). J'ai essayé avec un seul Thread.Sleep(time) entre les deux, mais on dirait que l'uniformGrid ne se rafraîchit qu'une seule fois en fin de traitement.

    J'ai alors essayé en créant un thread, et dans ce thread j'effectue un InvalidateVisual(), mais le jeton du joueur apparaît encore tout à la fin en même temps que celui du computer.

    voici le code de l'évènement (les parties "importantes" et en simplifié)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // colorier le mouvement du joueur
    arrayImage[i, colonneBouton].Encoche.Fill = ColorPlayer;
    // le thread
    Thread t = new Thread(new ThreadStart (threadContent) );
    t.Start();
    Thread.Sleep(1500);
    // l'ai et colorier le mouvement du computer
    gameAI.Movement();
    arrayImage[arrayAINumero[0, 0], arrayAINumero[0, 1]].Encoche.Fill = ColorComputer;
    voici le code du thread
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    private void threadContent()
    {   
    // j'ai aussi essayé avec gridPlateau.InvalidateVisual(), ça ne marche pas (gridPlateau étant le nom de mon uniformGrid) 
     
    this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal,
    (Action)(() => { InvalidateVisual(); }));
    }
    Quelqu'un aurait il une idée/solution pour que l'uniformGrid puisse se rafraîchir/redessiner en milieu de traitement??

    En espérant avoir été clair, d'avance merci!

  2. #2
    Membre éprouvé
    Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2009
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 99
    Par défaut
    Bonsoir,

    As-tu essayé d'utiliser un DispatcherTimer ?

    Si j'ai bien compris la problématique, tu veux mettre 2sec avant de lancer ton animation qui va faire jouer ton IA (pour simuler la réflexion) ?

    Si oui, l'algorithme donne ce qui suit :

    Choix de la case -> Fin du choix de la case -> Lancement du timer de X secondes -> Fin du timer -> Lancement de l'animation

    Bon courage

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2011
    Messages : 22
    Par défaut
    Merci beaucoup Lordinaire, ça fonctionne !

    si jamais quelqu'un à la même problème, voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // dans l'évènement
    ...
    dt = new DispatcherTimer { Interval = new TimeSpan(0, 0, 0, 1, 0) };
    dt.Tick += dt_Tick;
    dt.Start();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void dt_Tick(object sender, EventArgs e)
            {
                if (won == false)
                AIMove();
                DispatcherTimer thisTimer = (DispatcherTimer)sender;
                thisTimer.Stop();
            }

    Dernière petite question, dans les consignes du projet, on devait utiliser un thread, est ce que ce dispatcher peut faire office de thread ? j'ai un peu du mal à en comprendre le fonctionnement "théorique"..
    Parce que si c'est un thread que "lance" le dispatcherTime, comment se fait-il que ce thread peut accéder aux UIElement (ici une ellipse) créées par l'ui thread ?

    en tout cas, encore un grand merci.

    bonne journée

  4. #4
    Membre éprouvé
    Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2009
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 99
    Par défaut
    Reasons for using a DispatcherTimer opposed to a System.Timers.Timer are that the DispatcherTimer runs on the same thread as the Dispatcher and a DispatcherPriority can be set on the DispatcherTimer.
    En d'autre terme, le DispatcherTimer utilise le même thread que le Dispatcher, c'est ce qui permet de mettre à jour l'UI directement. Plus d'explications dans le billet DispatcherTimer : Qu'est-ce-que c'est ? de Jonathan Antoine sur WPF France

    Si tu dois utiliser absolument un thread, la logique reste la même. Tu peux utiliser le DispatcherTimer dans ton Thread à la place du Sleep(). Avec BeginInvoke() tu appelles ensuite une fonction qui mettra à jour ton UI.

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2011
    Messages : 22
    Par défaut
    bon, j'vais demander ton aide une dernière fois

    l'évènement lié au dispatchertimer ne veut pas se lancer quand je le place dans un thread

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     private void threadContent(int colonneBouton)
            {
                dtAnimation = new DispatcherTimer { Interval = new TimeSpan(0, 0, 1) };
                dtAnimation.Tick += dt_TickAnimation;
                dtAnimation.Tag = colonneBouton;
                dtAnimation.Start();
                System.Diagnostics.Debug.WriteLine("je suis passé 0");
            }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    private void dt_TickAnimation(object sender, EventArgs e)
            {
                System.Diagnostics.Debug.WriteLine("je suis passé 1");
              ...
            }
    voila, donc le message "je suis passé 0" à partir du thread s'affiche, mais pas le "je suis passé 1" déclenché dans l'évènement

  6. #6
    Membre éprouvé
    Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2009
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 99
    Par défaut
    J'ai fait une erreur dans ma réponse, c'est un Timer simple qu'il faut utiliser et non un DispatcherTimer.

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

Discussions similaires

  1. Problème rafraichissement d'une comboBox
    Par Alkaza dans le forum Silverlight
    Réponses: 3
    Dernier message: 16/05/2011, 15h59
  2. Réponses: 1
    Dernier message: 03/05/2007, 11h43
  3. [AJAX] Rafraichissement d'une liste en autocomplétion
    Par emilie1t dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 30/03/2007, 15h27
  4. [VB6]Problème de rafraichissement d'une combobox
    Par bb62 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 27/01/2006, 16h58
  5. Problème de "rafraichissement" dans une edit box e
    Par X-K4l1 dans le forum Windows
    Réponses: 1
    Dernier message: 23/08/2005, 11h49

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