Partage
  • Partager sur Facebook
  • Partager sur Twitter

probleme de l'arret de la boucle

    19 décembre 2009 à 19:27:11

    salut ,
    tout d'abord je tiens a remercier profondement "cysboy" et tout ceux qui ont participés a l'achevement du tuto "Programmation en Java" ,c'est super interessant voir "irrésistible" ! :p
    en fait j'ai eu un peu de mal a comprendre un detail.

    dans la partie 3 : "Java et la programmation événementielle" , la section 5 :"Interaction bouton(s) - application", dans la sous section "Contrôler votre animation : lancement et arrêt", vous pouvez le consulter http://www.siteduzero.com/tutoriel-3-1 [...] tml#ss_part_3

    mon probleme est le suivant :

    Citation : cysboy

    Comme je vous l'ai dit dans le chapitre sur les conteneurs, notre application, au démarrage de celle-ci, lance un thread : le processus principal de votre programme !
    Au démarrage, l'animation est lancée, celle-ci dans le même thread que notre objet Fenetre.
    Lorsque nous lui demandons de s'arrêter, aucun souci : les ressources mémoire sont libérées, on sort de la boucle infinie et l'application continue son court !
    Mais lorsque nous redemandons à l'animation de se lancer... L'instruction dans la méthode actionPerformed appelle la méthode go et, vu que nous sommes dans une boucle infinie : on reste dans la méthode go et on ne sort plus de la méthode actionPerformed de notre bouton !



    on reste dans la methode go et on ne sort plus de la methode actionPerformed, d'accord mais c'est le meme probleme avec le constructeur de notre fenetre,on a une boucle infinie et on ne sort jamais du constructeur de notre fenetre et pourtant ça marche parfaitement avant l'arret de la boucle .
    je vois pas tros le probleme car lors du changement de la variable booleenne la boucle est quitté puis elle est relancé de nouveau.


    je veux savoir aussi comment dans un seul thread (une boucle infinie est exécuté,l'action du bouton est intercepté et la valeur booleenne est modifié).

    merci d'avance :)
    • Partager sur Facebook
    • Partager sur Twitter
      19 décembre 2009 à 23:58:29

      hmm, je comprends pas très bien tes questions... :-°
      • Partager sur Facebook
      • Partager sur Twitter
        20 décembre 2009 à 15:50:16

        désolé pour ne pas etre claire, je vais reprondre tout dés le debut .

        private void go(){
                
                //Les coordonnées de départ de notre rond
                int x = pan.getPosX(), y = pan.getPosY();
                //Le booléen pour savoir si on recule ou non sur l'axe X
                boolean backX = false;
                //Le booléen pour savoir si on recule ou non sur l'axe Y
                boolean backY = false;
               
                //Pour cet exemple, j'utilise une boucle while
                //Vous verrez qu'elle fonctionne très bien
                while(true){
                       
                        //Si la coordonnée x est inférieure à 1, on avance
                        if(x < 1)backX = false;
                        //Si la coordonnée x est supérieure à la taille du Panneau
                        //moins la taille du rond on avance
                        if(x > pan.getWidth()-50)backX = true;
                       
                        //idem pour l'axe Y
                        if(y < 1)backY = false;
                        if(y > pan.getHeight()-50)backY = true;
                       
                        //Si on avance, on incrémente la coordonnée
                        if(!backX)
                                pan.setPosX(++x);
                        //Sinon on décrémente
                        else
                                pan.setPosX(--x);
                       
                        //Idem pour l'axe Y
                        if(!backY)
                                pan.setPosY(++y);
                        else
                                pan.setPosY(--y);
                               
                        //On redessine notre Panneau
                        pan.repaint();
                       
                        //Comme on dit : la pause s'impose ! Ici, 3 centièmes de secondes
                        try {
                                Thread.sleep(3);
                        } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                }
               
        }
        


        explication :
        l'appel de cette methode est la derniere instruction dans le constructeur de la fenetre juste apres fenetre.setVisible()
        cette methode met en mouvement un cercle de coordonnée (x,y);
        ça marche parfaitement, on lance l'application et le cercle est en mouvement.
        maintenant on veut ajouter des boutons pour arreter l'animation et la relancer,donc on doit arreter la boucle et la relancer,l'idée est de ne plus mettre while(true) mais while(this.animated) où animated est une variable booleenne qui se met a true si on appuie sur le bouton "go" et a false si on appuie sur le bouton "stop" et la modification de la valeur booleenne est suivie par l'appel a la methode go(),cet appel est tout le problem.

        l'animation marche normalement ,on appui sur stop, l'animation s'arrete jusqu'a maintenant c'est bon, puis on appui sur stop l'application se plante.

        ==>l'appel a go() fait planter l'application.
        cyboy a expliqué le probleme par la pile d'execution , je comprend bien le principe de la pile mais je vois pas le probleme.

        pour moi la methode go() est depilé quand animated=false puis empilé quand elle sera appelé.
        quelqu'un peut m'aider a comprendre le probleme ! je veux pas de solution !!!

        en fait la solution que cyboy a proposé est d'utiliser un autre thread en plus j'ai trouvé une solution pour la faire sans utilisé d'autre thread :p si vous etes interessé je peux poster le code.

        surtout pour ceux qui ont deja lu ce tuto , je vous en pris de me donner une petite explication :) sinon est ce que je peux contacter l'auteur ?

        merci d'avance :)

        • Partager sur Facebook
        • Partager sur Twitter
          22 décembre 2009 à 17:05:53

          salut,
          quelqu'un a deja lu le tuto "programmation en java" de "cysboy" ? si ma question est encore pas claire merci de le mentionner :)

          merci d'avance :)
          • Partager sur Facebook
          • Partager sur Twitter
            22 décembre 2009 à 17:27:03

            3 millièmes de sec c'est a bit short
            • Partager sur Facebook
            • Partager sur Twitter
              22 décembre 2009 à 18:04:41

              Dans son tuto interactions boutons il dit

              Citation

              Tout simplement parce que nous demandons de faire une bête initialisation de variable dans la gestion de notre événement ! Si vous faites une deuxième méthode comprenant une boucle infinie et que vous l'invoquez lors du clic sur Stop, vous aurez exactement le même problème !

              Je ne vais pas m'éterniser là-dessus tout de suite... Nous allons voir ça au prochain chapitre !



              J en suis la aussi mais je suppose que la reponse a ton probleme ets dans ce tuto ci
              http://www.siteduzero.com/tutoriel-3-1 [...] -threads.html



              • Partager sur Facebook
              • Partager sur Twitter
                22 décembre 2009 à 22:10:12

                J'ai vaguement consulté le tuto et ca me semble être plus ou moins correcte. Si tu avais lu tu aurais lu qu'il faut faire ca dans un Thread à part et qu'il va en parler au prochain chapitre. Sinon pour ta question :

                Citation : oswalidos

                je veux savoir aussi comment dans un seul thread (une boucle infinie est exécuté,l'action du bouton est intercepté et la valeur booleenne est modifié).


                Bin la réponse est simple : qui a dit qu'il y avait un seul Thread? Certain système de GUI comme sur Android utilise qu'un seul Thread grâce à un système assez compliqué, mais pas java. Donc quand tu clique sur un bouton ce n'est pas le même thread que le thread principal de programme (qui lui est bloqué sur le constructeur) il y a un thread chargé de recevoir les events, et donc si tu lance un boucle infinie depuis le ActionPermormed bin ca bloque tout le système pour recevoir les events et plus rien ne marche.
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  22 décembre 2009 à 23:58:58

                  Oui, c'est ça. Ton premier appel à go bloque le thread principal de l'application puisque l'appel au constructeur n'est jamais dépilé. Ce n'est pas grave (dans ce cas) puisque tu peux toujours écouter les évènements. Dans le cas du second appel, dans la méthode actionPerformed, tu bloques le thread qui écoute les évènements. Et là, c'est un peu plus embêtant.

                  Cela dit, il faut bien admettre que les explication de cysboy laissent bien souvent à désirer. Techniquement, le monsieur est peut-être compétent mais "faire" et "faire comprendre" ce n'est pas du tout la même chose.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    24 décembre 2009 à 14:43:10

                    désolé pour le retard,
                    merci bien pour l'explication, je comprend bien maintenant :)
                    a propos des threads qui sont lancés par une application ,y a il un document qui parle de ça ? merci de me donner un lien qui détaille le fonctionnement interne de l'application point de vue les listeners, les threads ....

                    merci encore :)
                    • Partager sur Facebook
                    • Partager sur Twitter

                    probleme de l'arret de la 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