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

C# Discussion :

Problème d'affichage dans un thread


Sujet :

C#

  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 d'affichage dans un thread
    Bonjour à tous,

    je fais un puissance 4 en wpf, et pour les jetons qui tombent dans la grille, j'aimerais bien faire un thread pour qu'on les voit tomber au fur et à mesure
    ( je sais qu'une animation aurait peut être été plus simple, mais comme on est obligé de faire un thread..)

    voila j'vais un peu simplifier le code pour aller à l'essentiel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    protected void Go()
            {
                for (int i = 0; i<=5; i++) 
                {
                            arrayImage[i, colonneBouton].Encoche.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal,
                                (Action)(() => { arrayImage[i, colonneBouton].Encoche.Fill = ColorPlayer; gridPlateau.InvalidateVisual(); }));                 
                    Console.WriteLine("je suis passé ici au tour numero " + i);
               }
    (arrayImage est un tableau d'objets que j'ai créés, ayant comme attributs une référence vers une ellipse(sous le nom d'encoche) et un boolean)
    (gridPlateau est une uniformGrid qui contient aussi une référence vers les mêmes ellipses que celle du tableau arrayImage)

    théoriquement, ce code devrait me remplir toute la colonne avec des ellipses de la couleur souhaitée, seulement il ne colore que la case avec l'indice i=5 (tandis que les messages "je suis passé..." s'affichent normalement)

    si je fais un break dans le for, il colorera la case i=0 ( ce qui est logique)

    comment cela se fait qu'il n'effectue qu'une fois l'opération de colorer, alors que le message s'affiche le bon nombre de fois ?

    D'avance, merci pour votre aide!

    (voici l'appel du thread, même si je ne pense pas que l'erreur vienne de là..)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Thread t = new Thread (Go);
    t.Start();
    t.Join();

  2. #2
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Bonjour.

    Le problème est assez simple. En l'espace de 50ns tu as changé cinq fois l'état de l'UI. Mais le rendu, quant à lui, ne se produit qu'une fois toutes les 16ms (60 ips en gros). Lorsque ceci se produit, c'est la dernière valeur qui est retenue.

    D'abord, la base : définir la durée de l'animation. En combien de temps veux-tu que le jeton tombe ? Puis, partant de là, deux approches :
    * Utiliser un timer multimédia (pas un timer basique, ceux-ci n'ont qu'une résolution de 15ms, très variable, et ça affectera la qualité de l'animation - parfois 30ms entre deux tics)
    * Souscrire à CompositionTarget.Rendering pour détecter qu'une nouvelle frame a été rendue afin de définir l'état de la prochaine.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    je fais un puissance 4 en wpf, et pour les jetons qui tombent dans la grille, j'aimerais bien faire un thread pour qu'on les voit tomber au fur et à mesure
    ( je sais qu'une animation aurait peut être été plus simple, mais comme on est obligé de faire un thread..)
    Pourquoi "obligé de faire un thread" ? En WPF un thread n'est presque jamais la bonne façon de faire ce genre de chose, une animation est beaucoup plus adaptée...

  4. #4
    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
    @DonQuiche
    Tout d'abord, merci pour ta réponse. Dans le code complet, à la fin de la boucle j'avais un Thread.Sleep(500), je pensais que cela suffirait pour laisser le temps à l'interface d'afficher le changement !?


    @tomlev
    "obligé", en fait on doit faire un thread quelconque dans notre projet, et même si une animation était plus appropriée pour ce que je voulais faire ici, je me disais que ça me permettrait d'éliminer cette contrainte.. La loi du moindre effort on va dire!

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par mouette999 Voir le message
    @tomlev
    "obligé", en fait on doit faire un thread quelconque dans notre projet, et même si une animation était plus appropriée pour ce que je voulais faire ici, je me disais que ça me permettrait d'éliminer cette contrainte.. La loi du moindre effort on va dire!
    Ah, c'est un projet scolaire alors ?

    Dans ce cas, un endroit où l'utilisation d'un thread serait plus appropriée est le choix du prochain coup par l'IA (en supposant qu'il y ait une IA)

  6. #6
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Citation Envoyé par mouette999 Voir le message
    @DonQuiche
    Tout d'abord, merci pour ta réponse. Dans le code complet, à la fin de la boucle j'avais un Thread.Sleep(500), je pensais que cela suffirait pour laisser le temps à l'interface d'afficher le changement !?
    C'est à l'intérieur de la boucle qu'il aurait fallu le mettre.
    Au passage... Essaie de retirer Console.WriteLine en faveur d'un Debug.WriteLine.

  7. #7
    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
    Citation Envoyé par tomlev Voir le message
    Ah, c'est un projet scolaire alors ?

    Dans ce cas, un endroit où l'utilisation d'un thread serait plus appropriée est le choix du prochain coup par l'IA (en supposant qu'il y ait une IA)
    oui c'est un projet scolaire..

    oui y'aura une IA (c'est d'ailleurs le prochain truc dont je m'occuperai après ceci..)
    j'ai pas encore trop regardé comment fonctionnera l'IA, mais je ne vois pas où ce que j'aurais des threads là dedans ?! enfin bref, on n'y est pas encore, laissons ce (futur ) problème de côté

  8. #8
    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
    Citation Envoyé par DonQuiche Voir le message
    C'est à l'intérieur de la boucle qu'il aurait fallu le mettre.
    Au passage... Essaie de retirer Console.WriteLine en faveur d'un Debug.WriteLine.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    protected void Go()
            {
                for (int i = 0; i<=5; i++) 
                {
                            arrayImage[i, colonneBouton].Encoche.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal,
                                (Action)(() => { arrayImage[i, colonneBouton].Encoche.Fill = ColorPlayer; gridPlateau.InvalidateVisual(); }));                 
                    Thread.Sleep(500);
               }
       }
    je l'ai mis comme ça, "en fin" de boucle, mais à l'intérieur quand même, désolé si c'était confus..

    j'ai essayé le Debug.WriteLine, à première vu ça a le même résultat, enfin je vais un peu me renseigner dessus

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par mouette999 Voir le message
    j'ai pas encore trop regardé comment fonctionnera l'IA, mais je ne vois pas où ce que j'aurais des threads là dedans ?! enfin bref, on n'y est pas encore, laissons ce (futur ) problème de côté
    Bah en supposant que l'IA mette un certain temps à réfléchir, il faut le faire sur un thread séparé, sinon l'interface graphique ne répondra plus pendant ce temps. C'est d'ailleurs la principale raison d'utiliser des threads dans une application de bureau : ne pas bloquer l'interface pendant un traitement long

Discussions similaires

  1. Réponses: 10
    Dernier message: 06/12/2011, 13h56
  2. Réponses: 2
    Dernier message: 07/08/2010, 22h34
  3. problème d'affichage dans un thread
    Par innosang dans le forum POSIX
    Réponses: 8
    Dernier message: 20/12/2006, 20h40
  4. Problème d'affichage dans un composant TScrollBox
    Par erossi dans le forum Composants VCL
    Réponses: 3
    Dernier message: 14/09/2005, 11h29
  5. [débutant]problèmes d'affichage dans un tableau
    Par Hastur dans le forum Balisage (X)HTML et validation W3C
    Réponses: 12
    Dernier message: 16/08/2005, 12h00

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