Visualizzazione dei risultati da 1 a 8 su 8

Discussione: Timer e Thread

  1. #1

    Timer e Thread

    CIao a tutti! Sto realizzando un progetto, e vi spiego brevemente.
    Ho in una classe esistente, questa classe :

    codice:
    private class SimpleRunner implements Runnable         
    {             
    public void run()            
    {                 
    simulate(500);             
    }         
    }
    Che mi gestisce correttamente quello che voglio fare. Ora il mio problema è che, voglio creare un'interfaccia grafica (fatta) che mi permetta di gestire l'avvio e lo stop di questo thread. Cioe avere un bottone AVVIO che me lo faccia partire e un bottone PAUSA che lo fermi e ripremendo nuovamente su AVVIO riparte da dove era. Per quanto riguarda l'avvio parte senza problemi, solo che non riesco a fermarlo! Vi posto quello che ho scritto (questa funzione sta sempre nel medesimo file):

    codice:
    public void makeMenuBar(JFrame frame)
        {
            JMenuBar menubar = new JMenuBar();
            frame.setJMenuBar(menubar);
            final JButton avvio=new JButton("Avvio");
            Button stop=new Button("Stop");
            Button onestep=new Button("OneStep");
            Button nstep=new Button("NStep");
            menubar.add(avvio);
            menubar.add(stop);
            menubar.add(onestep);
            menubar.add(nstep);
            
            avvio.addActionListener(new ActionListener() 
            {
                public void actionPerformed(ActionEvent e) 
                    { 
                        Thread t = new Thread (new SimpleRunner());
                        t.start ();                    
                    }
            });
            
            
            stop.addActionListener(new ActionListener() 
            {
                public void actionPerformed(ActionEvent e) 
                    { 
                        // QUI COME LO FERMO?!                   
                    }
            });
        }

  2. #2
    Cosa fa il metodo simulate()?
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  3. #3
    Ciao! Allora, il metodo simulate() mi gestisce la simulazione di grafica del mio programma. Molto brevemente è un simulatore di vita, dove c'è una grigia, e nella griglia ogni puntino rappresenta un "essere" che nasce, muore e si riproduce. Ad ogni passo questo "puntino" si sposta nella griglia ed effettua delle operazioni. Simulate() mi gestisce un passo, quindi scrivere simulate(500) è per simulare 500 passi consegutivi!

  4. #4
    Quindi immagino che al suo interno ci sia un ciclo che tu vuoi mettere in pausa alla pressione del tasto stop e riprendere premendo il tasto start.
    Potresti fare una cosa del genere:

    codice:
    public void makeMenuBar(JFrame frame)
        {
            JMenuBar menubar = new JMenuBar();
            frame.setJMenuBar(menubar);
            final JButton avvio=new JButton("Avvio");
            Button stop=new Button("Stop");
            Button onestep=new Button("OneStep");
            Button nstep=new Button("NStep");
            menubar.add(avvio);
            menubar.add(stop);
            menubar.add(onestep);
            menubar.add(nstep);
    
            Thread t = null;
            SimpleRunner simpleRunner = new SimpleRunner();
            
            avvio.addActionListener(new ActionListener() 
            {
                public void actionPerformed(ActionEvent e) 
                    { 
                        if (t == null) {
                            t = new Thread (simpleRunner);
                            t.start();      
                        } else {
                            simpleRunner.isRunnung(true);
                        }            
                    }
            });
            
            
            stop.addActionListener(new ActionListener() 
            {
                public void actionPerformed(ActionEvent e) 
                    { 
                        simpleRunner.isRunning(false);
                    }
            });
        }
    codice:
    private class SimpleRunner implements Runnable         
    {
    private boolean running = true;
    
    public void isRunning(boolean value) {
        running = value;
    }
                 
    public void run()            
    {                 
    simulate(500);             
    }         
    }
    All'interno del metodo simulate() dorvai gestire l'attributo booleano running in modo da interrompere/riprendere il ciclo.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  5. #5
    Hai ragione... anche io avevo pensato di dover usare dei boolean, solo che in effetti non avevo pensato di dover sistemare poi anche il ciclo! Grazie!
    Ora sto provando, solo che sistemando il codice in questa maniera (come hai scritto tu) mi dice :
    codice:
    local variable t is accessed from within inner class
    e mi dice di dichiararla final... ma ovviamente cosi poi non posso modificarla

  6. #6
    Sposta la dichiarazione fuori dal metodo makeMenuBar()
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  7. #7
    Si ci avevo pensato e infatti funziona!
    Solo che ora di fatto me lo blocca, ma se premo nuovamente su avvia non mi riprende la simulazione!
    Ora sto provando a lavorare sulle condizioni!
    Vi posto il codice (semplificato) della classe :

    codice:
    import java.util.Random;
    import java.util.List;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.awt.Color;
    import java.util.Collections;
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.image.*;
    import javax.swing.*;
    
    public class Simulator
    {
        // VARIE DICHIARIAZIONI
        
        private Thread t = null;
        private SimpleRunner r = new SimpleRunner();
        
       // VARI METODI
    
        public void runLongSimulation()
        {
            simulate(500);
        }
    
        public void simulate(int numSteps)
        {
            for(int step = 1; step <= numSteps && view.isViable(field) && r.isRunning()==true; step++) {
                simulateOneStep();
            }
        }
     
        public void simulateOneStep()
        {
            //aumenta variabile che conta gli step
            step++;
            
            //invoca il metodo act su tutti gli oggetti contenuti nella lista delle location
            for(Location loc : locations) {
                field.getObjectAt(loc).act();
            }
            
            //resetta gli attributi su ogni animale della mappa
             for(Location loc : locations) {
                LocationType locType = field.getObjectAt(loc);
                if(locType instanceof Grass) {
                    Grass grass = (Grass) locType;
                    grass.resetAnimalAttrib();
                }
            }
            
            //randomizza la lista
            Collections.shuffle(locations,rand);
            
            //mostra la nuova composizione
            view.showStatus(step, field);
            
        }
            
        /**
         * Reset the simulation to a starting position.
         */
        public void reset()
        {
            step = 0;
            locations.clear();
            populate();
            
            //crea la lista delle location
                    for(int row = 0; row < field.getDepth(); row++) {
                for(int col = 0; col < field.getWidth(); col++) {
                    locations.add(new Location(row,col));
                }
            }
            // Show the starting state in the view.
            view.showStatus(step, field);
        }
        
    public void makeMenuBar(JFrame frame)
        {
            JMenuBar menubar = new JMenuBar();
            frame.setJMenuBar(menubar);
            Button avvio=new Button("Avvio");
            Button stop=new Button("Stop");
            Button onestep=new Button("OneStep");
            Button nstep=new Button("NStep");
            Button reset=new Button("Reset");
            menubar.add(avvio);
            menubar.add(stop);
            menubar.add(onestep);
            menubar.add(nstep);
            menubar.add(reset);
            
            avvio.addActionListener(new ActionListener() 
            {
                public void actionPerformed(ActionEvent e) 
                    { 
                        if(t==null)
                        {
                            t = new Thread(r);
                            t.start();
                        }
                        else
                        {
                            r.setRunning(true);
                        }
                    }
            });
            
            stop.addActionListener(new ActionListener() 
            {
                public void actionPerformed(ActionEvent e) 
                    { 
                        r.setRunning(false);
                    }
            });
            
            
            onestep.addActionListener(new ActionListener() 
            {
                public void actionPerformed(ActionEvent e) 
                    { 
                        simulateOneStep(); 
                    }
            });
            
            nstep.addActionListener(new ActionListener() 
            {
                public void actionPerformed(ActionEvent e) 
                    { 
                        t = new Thread (new NRunner());
                        t.start();
                    }
            });
            
            reset.addActionListener(new ActionListener() 
            {
                public void actionPerformed(ActionEvent e) 
                    { 
                        reset();
                    }
            });
        }
    
        private class SimpleRunner implements Runnable
        {
            private boolean running = true;
            
            public void setRunning(boolean value)
            {
                running = value;
            }
            
            public boolean isRunning()
            {
                return running;
            }
               
            public void run()
            {
                simulate(500);
            }
        }
        
        private class NRunner implements Runnable
        {
            public void run()
            {
                String s = JOptionPane.showInputDialog(null, "Quanti step vuoi eseguire?");
                int n = Integer.parseInt(s);
                simulate(n); 
            }
        }
                                           
    }

  8. #8
    Sono riuscito a risolvere da solo ieri
    Grazie comunque per le dritte!!!

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.