Partage
  • Partager sur Facebook
  • Partager sur Twitter

Mettre un thread en pause

comment controler un thread avec mon bouton...

Sujet résolu
    9 décembre 2008 à 22:05:02

    Salut le forum
    Voila mon probleme, je farfouille dans le tuto de cysboy et j'ai voulu refaire le programme animation en reprenant à zéro et en le faisant "à ma façon"...
    Donc je me lance, pas de problème jusqu'à la partie sur la gestion des threads...Pour moi, deux boutons, ça fait trop, j'en ai mis un seul et je veux que si j'appuie avec l'animation à l'arret, elle démarre, et inversement, si elle est lancée, elle se mette en pause.
    Et donc le probleme classique : comment mettre en pause le thread qui dessine mon animation?????
    Je vous mets la classe Fenetre
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    
    
    public class Fenetre extends JFrame {
    	
    	private Panneau pan = new Panneau();
    	private Bouton clic1 = new Bouton("Clic!");
    	private JPanel conteneur = new JPanel();
    	private JLabel label = new JLabel("cliquez en bas pour demarrer/arreter");
    	private boolean animated = true;
    	private Thread t;
    
    
    	
    	private static int largeur = 500;//largeur de la fenetre
    	private static int hauteur = 400;//hauteur de la fenetre
    	
    	
    	private static int large = (int)(largeur/8);//largeur de l'animation
        private static int haut = (int)(hauteur/8);//hauteur de l'animation
    	
    	
    	
    	/*
    	 * Constructeur de la fenetre
    	 */
    
    	public Fenetre(){
    	
    	this.setTitle("fenetre sur l'âme");//humour desoeuvré
    	this.setSize(largeur,hauteur);
    	this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    	this.setLocationRelativeTo(null);
    	
    	clic1.addActionListener(new BoutonListener());
    
    
    	
    	conteneur.setBackground(Color.white);
        conteneur.setLayout(new BorderLayout());
        conteneur.add(pan, BorderLayout.CENTER);
        conteneur.add(clic1, BorderLayout.SOUTH);
        
        Font police = new Font("Tahoma", Font.BOLD, 16 );
        label.setFont(police);
        label.setForeground(Color.blue);
        label.setHorizontalAlignment(JLabel.CENTER);
        
        conteneur.add(label, BorderLayout.NORTH);
    
        
        this.setContentPane(conteneur);
        this.setVisible(true);
    	
    	
    	//go();
    	
    	}
    	
    	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;
            
            //boucle gérant l'animation
            while(animated=true){
                    
                    
                    if(x < 1)backX = false;
                    if(x > pan.getWidth()-Fenetre.getLarge())backX = true;
                    
                    
                    if(y < 1)backY = false;
                    if(y > pan.getHeight()-Fenetre.getHaut())backY = true;
                    
                    
                    if(!backX)
                            pan.setPosX(++x);
                    else
                            pan.setPosX(--x);
                    
                    
                    if(!backY)
                            pan.setPosY(++y);
                    else
                            pan.setPosY(--y);
                            
                    
                    pan.repaint();
                    
                    
                    try {
                            Thread.sleep(3);
                    } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                    }
            }
    
    
    	
    	}
    //-------------------------------------------------------------------------------------------------------------------------------------------
    //  							ACCESSEURS
    //-------------------------------------------------------------------------------------------------------------------------------------------
    	
    	/**
    	 * @return the large
    	 */
    	public static int getLarge() {
    		return large;
    	}
    
    
    
    	/**
    	 * @return the haut
    	 */
    	public static int getHaut() {
    		return haut;
    	}
    	/**
    	 * @param animated the animated to set
    	 */
    	public void setAnimated(boolean animated) {
    		this.animated = animated;
    		
    	}
    
    	
    	/**
    	 * @return the animated
    	 */
    	public boolean isAnimated() {
    		return animated;
    	}
    
    
    	/**
    	 * classe qui écoute notre bouton
    	 */
    	class BoutonListener  implements ActionListener{
    
    	        /**
    	         * Redéfinition de la méthode actionPerformed
    	         * @return 
    	         */
    	        public synchronized void actionPerformed(ActionEvent arg0) {
    
    	        	if(!animated){
    		        	setAnimated(true);
    		        	t = new Thread(new PlayAnimation());
    		        	t.start();
    	        	}
    	        	else{
    	        		setAnimated(false);
    	        		try {
    						Thread.currentThread().wait();
    					} catch (InterruptedException e) {
    						// TODO Auto-generated catch block
    						e.printStackTrace();
    					}
    	        	}
            	
    	        }
    	        
    	}
            /**
            *  classe gérant le thread
            */
    	class  PlayAnimation implements Runnable{
    		 
            @Override
            public synchronized void run() {
            		
            			go();
               
            }
    	}
    }
    


    Le problème étant dans la classe BoutonListener, qui me fait une grosse vilaine erreur
    Exception in thread "AWT-EventQueue-0" java.lang.IllegalMonitorStateException
            at java.lang.Object.wait(Native Method)
            at java.lang.Object.wait(Object.java:485)
            at Fenetre$BoutonListener.actionPerformed(Fenetre.java:179)
            at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
            at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
            at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
            at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
            at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
            at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
            at java.awt.Component.processMouseEvent(Unknown Source)
            at javax.swing.JComponent.processMouseEvent(Unknown Source)
            at java.awt.Component.processEvent(Unknown Source)
            at java.awt.Container.processEvent(Unknown Source)
            at java.awt.Component.dispatchEventImpl(Unknown Source)
            at java.awt.Container.dispatchEventImpl(Unknown Source)
            at java.awt.Component.dispatchEvent(Unknown Source)
            at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
            at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
            at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
            at java.awt.Container.dispatchEventImpl(Unknown Source)
            at java.awt.Window.dispatchEventImpl(Unknown Source)
            at java.awt.Component.dispatchEvent(Unknown Source)
            at java.awt.EventQueue.dispatchEvent(Unknown Source)
            at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
            at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
            at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
            at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
            at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
            at java.awt.EventDispatchThread.run(Unknown Source)


    Donc je sais que ce que je fais ne marche pas(je mets ma dernière version, mais j'ai tatonné dans tout les sens...), mais z'alors comment faire...
    Si qqun peut m'éclairer, merci d'avance, je vais aller relire Javadoc en entier :euh: .....
    • Partager sur Facebook
    • Partager sur Twitter
      9 décembre 2008 à 23:28:49

      Citation : boiss007

      ... je veux que si j'appuie avec l'animation à l'arret, elle démarre, et inversement, si elle est lancée, elle se mette en pause.



      Pour faire ça tu crées une variable booléenne. Tu décides si c'est vrai ou faux qui lance/met en pause.
      Dans ta boucle où tu fais l'animation tu fait un test sur le booléen. Si il est à la valeur décidé pour mettre en pause tu bloques avec un sémaphore et quand tu reclic sur ton bouton tu change la valeur du booléen et tu libère ton sémaphore.

      J'ai pas regarder ton code donc je sais pas comment tu as organisé ton animation mais sur le principe tu peux faire comme ca.
      • Partager sur Facebook
      • Partager sur Twitter
        10 décembre 2008 à 3:25:50

        Bah j'ai ma variable booléenne, en condition d'une boucle while, ma question, c'est comment mettre en pause l'animation.
        Le cliquage du bouton est recupéré par un actionListener qui lance un thread qui contient mon animation(j'espère que c'est clair, sinon, ya mon code au dessus s'pas...)mais je n'arrive pas au second clic à mettre le thread en pause, ma booléenne ne sert à rien puisque le thread de l'animation continue à tourner et donc l'animation à se faire...
        Sinon, je vais jeter un oeil aux sémaphores, ça me dit qqchose mais il est tard, donc demain.... :p
        • Partager sur Facebook
        • Partager sur Twitter
          10 décembre 2008 à 3:47:19

          Bonjour,

          Problème classique, je le fais 3 fois par page de code :p

          //boucle gérant l'animation
                  while(animated=true){
          


          est une affectation, pour une comparaison on écrit

          //boucle gérant l'animation
                  while(animated==true){
          


          ou encore mieux :

          //boucle gérant l'animation
                  while(animated){
          


          puisque "animated" et "animated==true" ont évidemment même valeur de vérité (et heureusement, sinon il faudrait mettre ((((animated==true)==true)==true)...) !)
          • Partager sur Facebook
          • Partager sur Twitter
            10 décembre 2008 à 14:54:36

            lol la honte.. :'(:waw:

            Merci, je vais reprendre tout ça.


            Et ça marche impec avec un petit
            public synchronized void actionPerformed(ActionEvent arg0) {
            
            	        	if(!animated){
            	        		animated = true;
                                t = new Thread(new PlayAnimation());
                                t.start();
            	        	}
            	        	else
            	        		animated = false;
                    	
            	        }
            


            Merci bcp
            • Partager sur Facebook
            • Partager sur Twitter

            Mettre un thread en pause

            × 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