Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de repaint dans une boucle

Le thread main ne rend pas la main

Sujet résolu
    27 octobre 2008 à 20:16:58

    Bonjours à tous
    Alors dans le cadre de la création d'un jeu (style tetris), je souhaite effectuer des "repaint()" dans certaines boucles.
    Dans le cas présent, il s'agit d'un test sur la suppression des espaces vides, donc je possède une boucle du style:
    public static void main(String[] args)
    {
       ...
       while(plateau.enlevage_trou())
       {
          try
          {
             Thread.sleep(500);
          }
          catch (InterruptedException e1)
          {
             e1.printStackTrace();
          }
          actualisation de l'affichage dans le panneau;
          repaint();
       }
       ...
    }
    

    Cette est sensée faire des repaint entre chaque modification (je fais descendre d'une case tout ce qui doit redescendre afin de les "voir" descendre)
    Or le repaint ne se fait qu'une fois la boucle finie
    Après un nombre important de recherches, j'ai alors découvert que le problème viendrait du fait que la méthode main ne rend la main au repaint qu'une fois sa boucle finit (donc j'ai directement e résultat final)

    Je me suis donc penché sur les thread et j'en ai créé un qui va faire un repaint toutes les 40ms de façon à ce que ce soit indépendant et ne gérer ainsi que "l'intérieur".
    Tout marche à la perfection, grâce à un affichage en console, je peux voir les repaint, sauf pour mon plus grand malheur arrivé à cette partie du code: rebelote ... la boucle se fait et ne rend la main qu'une fois finie.
    Incompréhension totale, vu que normalement le sleep(500) doit rendre la main et ne reprendre que 500ms plus tard.

    Donc voilà, je demande de l'aide (et croyez moi si je le fais, c'est vraiment en dernier recours, j'ai fait des heures de recherches)

    Merci d'avance
    • Partager sur Facebook
    • Partager sur Twitter
      27 octobre 2008 à 22:44:08

      Normal, repaint est une méthode qui est chargée de s'executer en boucle, je sais pas ou mais il y'a moyen de parrametrer le temps de refresh.
      t'a pas besoin de dfinir une boucle, tu mettra tout simplement ton code dans la redefinition de la méthode repaint. essaie ça.
      • Partager sur Facebook
      • Partager sur Twitter
      J'ai tous les badges d'OpenClassrooms.
        28 octobre 2008 à 10:12:58

        Merci de cette réponse rapide, j'essais de regarder dans ce sens là pour trouver une solution

        Edit: Après plusieurs tests, le problème semble rester le même, le main ne rend pas la main au repaint tant qu'il n'a pas finit sa boucle (malgrès le sleep(500) et plusieurs tests avec un Thread.yield())
        • Partager sur Facebook
        • Partager sur Twitter
          29 octobre 2008 à 17:43:03

          Après un nombre important de recherches, j'ai une petite question:
          Est-ce que le double-buffering pourrait régler ce problème ???

          L'affichage étant suffisamment fluide, je ne pensais pas en avoir besoin et le problème semble venir du main qui ne rend pas la main au reste tant que la boucle n'est pas finie (malgré le sleep(500))
          Donc si quelqu'un pouvait m'aider, ce serait super

          Merci d'avance

          EDIT:
          Bon merci quand même ^^
          J'ai trouvé le problème (enfin en tout cas la solution ;))

          Donc pour ceux qui pourraient avoir le même soucis, la solution était simple:
          Il faut créer un Thread qui va faire l'action désiré, en l'occurence ici ma boucle.

          Donc je fais une petit résumé:
          J'ai un thread qui repaint régulièrement
          Je lance un thread qui vas enlever les trous 1 par 1 de mon tableau avec un sleep pour bien voir l'évolution étape par étape dans une boucle

          En faisant ça, les threads se laissent mutuellement la main lors de leur sleep
          Maintenant je saurais que le sleep du thread principal ne semble pas rendre la mains aux autres tant qu'il est en boucle même avec des sleep

          Voilà, j'espère avoir aidé quelques personnes
          • Partager sur Facebook
          • Partager sur Twitter
            4 novembre 2008 à 13:06:24

            Bonjour,

            serait-il possible d'avoir le code de votre solution ?

            Je vous remercie
            • Partager sur Facebook
            • Partager sur Twitter
              4 novembre 2008 à 17:49:42

              Bonjour
              Bien entendu ^^ mais qu'est-ce qui t'intéresse exactement ???
              • Partager sur Facebook
              • Partager sur Twitter
                4 novembre 2008 à 18:22:25

                cf le sujet que j'ai ouvert : http://www.siteduzero.com/forum-83-336 [...] html#r3120006

                Il me semble que c'est le même type de soucis
                • Partager sur Facebook
                • Partager sur Twitter

                Problème de repaint dans une boucle

                × 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