Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [JAVA] Mettere in pausa un Thread da JButton

    Salve a tutti sto cominciando a lavorare questi giorni con i Thread e ancora devo prenderci la mano

    Veniamo al dunque: il programma dovrebbe, dopo aver premuto Start, far partire un countdown e nel mentre c'è la possibilità di cambiare colore allo sfondo premendo un bottone Colore. Inoltre volevo implementare la possibilità di mettere in Pausa il countdown e farlo riprendere alla seconda pressione di Pausa (con un If e un boolean dovrei cavarmela).

    Ora le domande sono due...
    - dal codice che ho scritto riscontro un problema nel pulsante pausa (che in questa prova blocca il Thread e non lo mette in pausa) ossia che non ferma il thread
    - e inoltre come si mette in pausa un thread? in questo caso devo anche poter riprendere lo stesso Thread...e se si preme su Start con la pausa attiva non deve creare nulla (un boolean risolverà il tutto )

    codice:
    import java.awt.*;
    import javax.swing.*;
    
    import java.awt.event.*;
    
    public class Countdown extends JPanel implements Runnable{
    
        private Thread th;
        private JLabel p;
        private boolean partito=false;
        private boolean pausa;
        
        
    	public Countdown(){
    	       setBackground(Color.white);
    	       setPreferredSize(new Dimension(500,200));
    	       JFrame f = new JFrame("Countdown");
    	       p = new JLabel("Contiamo....");
    	       add(p);
    	       f.setLayout(new BorderLayout());
    	       JPanel t = new JPanel();
    	       t.setPreferredSize(new Dimension (500,100));
    	       t.setBackground(Color.red);
    	       
    	       JButton bottonestart = new JButton("Start");
    	       ActionListener listenstart = new ActionListener(){
    	    	   public void actionPerformed(ActionEvent ae){
    	                          if(!partito){
    	                        	  start();
    	                        	  System.out.println("è partito il countdown...");
    	                        	  partito=true;
    	                          }
    	                          
    	    	   }
    	       };
    	       bottonestart.addActionListener(listenstart);
    	       t.add(bottonestart);
    	       
    	       JButton bottonepausa = new JButton("Pausa");
    	       ActionListener listenpausa = new ActionListener(){
    	    	   public void actionPerformed(ActionEvent ae){
    	    	                       if(partito){
    	    	                    	   stop();
    	    	                       }
    	    	                    	   partito=false;
    	    	                      
    	    	   }
    	       };
    	       bottonepausa.addActionListener(listenpausa);
    	       t.add(bottonepausa);
    	       
    	       JButton bottonecolore = new JButton("Colore");
    	       ActionListener listencolore = new ActionListener(){
    	    	 public void actionPerformed(ActionEvent ae){
    	    		                     //cambio colore del pannello
    	    		 Color colore = new Color((int)(Math.random()*255),(int)(Math.random()*255),(int)(Math.random()*255));
    	    		 setBackground(colore);
    	    	 }
    	       };
    	       bottonecolore.addActionListener(listencolore);
    	       t.add(bottonecolore);
    	       
    	       f.add(this, BorderLayout.CENTER);
    	       f.add(t, BorderLayout.SOUTH);
    	       f.pack();
    	       f.setVisible(true);
    	       f.setResizable(false);
    	       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	       
           
    	}
    	
    	public void stop(){
    		System.out.println("Stai bloccando il thread"+th);
    		th = null;
    	
    	}
    	
    	public boolean isRunning(){
    
    	
    		return th != null;
    		
    	}
    	
    
    	
    	public void start(){
    	
    		if(!isRunning()){
    		
    			th = new Thread(this);
    			System.out.println("Sta partendo il thread"+th);
    			th.start();
    		
    		}
    		
    		
    	
    	}
    	
    	
    	public void run(){
    	
    		
    		while(isRunning()){						// se il thread Ë partito
    		
    			for(int i=10; i >= 0; i --){
    			      p.setText("siamo al numero .... "+i); 	
    			      try{
    
    						Thread.sleep(1000);
    
    					}catch(InterruptedException e){
    
    						e.printStackTrace();
    				}
    
    			}
    			
    			p.setText("Il countdown del thread "+th+" è finito :D");
    			partito=false;
    			stop();	
    		}
    	
    	}
    	
    	
    	
    	
    	
    	public static void main(String[] args) {
    		
    new Countdown();
    	}
    
    }
    Grazie in anticipo

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2012
    Messaggi
    49
    Non puoi mettere in pausa un thread e poi farlo ripartire come niente fosse.. devi creare un nuovo thread direttamente!

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    347
    parlo da ignorante in materia, ma non esistono i metodi sleep() (o wait forse), notify() e notifyAll() proprio per questo?

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2012
    Messaggi
    49
    si ovviamente si, ma il thread esegue delle istruzioni e se vuoi riavviarlo per farle rieseguire non puoi fare stop e start, ma devi crearlo di nuovo poichè credo non ci sia un metodo che lo riavvia

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    347
    no ovviamente no, ma lui mi pare che parli solo di "mettere in pausa" non di riavviare, se è un thread il cui metodo run contiene un ciclo infinito, come spesso si fa, allora è fattibile la cosa, ma se il metodo run esegue qualche istruzione e poi si ferma allora non c'è nemmeno il tempo... tutto dipende da che tipo di istruzioni eseguano i thread penso

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Il modo migliore per mettere in pausa e poi riprendere un thread (se dovesse servire) è utilizzare una variabile booleana.

    Il topic è vecchio, ma era solo per completamento.

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    347
    no, perchè a quel punto tu lo stoppi! Tu intendi qualcosa di questo tipo vero?:
    Codice PHP:
    public void run(){
        while(!
    stopped){
            
    doSomeStuff();
        }

    se è così come ho detto prima stopperesti completamente il thread, e dopo dovresti richiamare il metodo start e aggiustare la variabile booleana

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Si, giusto, in quel modo non riprendi più l'esecuzione. Utilizzando però la variabile booleana con wait() e notify() si è in grado di riprendere l'esecuzione, utilizzando anche un "lock" sull'oggetto.

  9. #9
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    347
    non ho capito bene che vuoi dire con la variabile booleana XD... però forse ho capito quella cosa dell'oggetto per il lock, mi pare l'abbiamo fatto una volta all'università: praticamente si crea, nella classe che estende Thread, un oggetto Object, magari chiamandolo anche lock e si mette a "dormire" il thread su quell'oggetto giusto?

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Si, praticamente funziona così. Guarda il codice a questo indirizzo: http://solopc.forumcommunity.net/?t=49960748
    In questo caso il lock sull'oggetto pone in pausa il player.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.