Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di Fichico
    Registrato dal
    Nov 2002
    residenza
    Bologna
    Messaggi
    581

    Pausa durante l'esecuzione .. Thread?

    ciao a tutti
    avrei bisogno di inserire una pausa di un secondo all'interno dell'esecuzione di un metodo in modo che si fermi temporaneamente e riprenda, per simulare lo spostamento di alcuni oggetti su un contenitore

    solo che non riesco proprio a farlo fermare..se metto sleep o wait mi fa vedere il risultato solo alla fine..come non si fermasse
    Le pause le dovrei mettere nelle apposite parti commentate col // davanti

    il metodo, in particolare, è questo:
    Codice PHP:
        public void simulaClick(int daXint daYint aXint aYString pezzoPromosso){
            
    contaClick++;
            
    contaClick++;
            
    contaClick 0;
            
    setIncrementoMosseEseguite();
            
    scacchiera.selezionaCasa(daXdaY);
            
    // = >pausaEsecuzione();
            
    spostaPezzo(daXdaYaXaYpezzoPromosso);
            
    infoPartita.setTratto(tratto);
            
    // = >pausaEsecuzione();
        

    qualche esperto mi aiuterebbe?
    grazie mille

  2. #2
    Utente di HTML.it L'avatar di Ed_Bunker
    Registrato dal
    Jul 2003
    Messaggi
    1,119
    Cosa significa che "ti fa vedere il risultato solo alla fine" ?
    Una chiamata a Thread.sleep(1000) dovrebbe essere cio' che fa al caso tuo...

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2006
    Messaggi
    146
    quoto fortemente!!

  4. #4
    Utente di HTML.it L'avatar di Fichico
    Registrato dal
    Nov 2002
    residenza
    Bologna
    Messaggi
    581
    vi spiego meglio
    quel metodo mi aggiorna una matrice di oggetti di tipo pezzo
    dopo che l'ha aggiornata applica su un oggetto JPanel che ha un gridlayout, la "riscrittura" della scacchiera, in quanto essendo composto da jbutton dobbiamo riassociare ad ogni bottone l'icona del pezzo che contiene

    se gioco normalmente lo fa e non ho bisogno di pause in quanto man mano chi ha la mossa la fa

    se simulo una partita, leggedo una partita salvata, scorrendo l'elenco delle mosse devo richiamare sempre quel metodo appena una mossa è valida

    quindi ad esempio potrei eseguire:
    - mossa1
    - mossa2
    - mossa3
    - mossa4

    se non metto nulla, esegue troppo veloce e vedo il risultato degli spostamentio solo quando ha finito di "simulare" quelle 4 mosse
    se metto lo sleep idem .. vedo tutto solo alla fine

    invece io vorrei che facesse:
    mossa1 -> vedo che il pezzo da X è andato in Y, ovvero in X non c'è più nulla ma lui è in Y
    mossa2 -> idem

    ecc ecc

    spero di essermi spiegato un po' meglio

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2006
    Messaggi
    146
    Prova ad inserire:

    Thread.sleep(1000);

    al posto di:

    // = >pausaEsecuzione();

    E dimmi se funziona, o se ti da errori.

  6. #6
    Utente di HTML.it L'avatar di Fichico
    Registrato dal
    Nov 2002
    residenza
    Bologna
    Messaggi
    581
    ho provato e, come ho scritto, non da errori ma .. vedo tutto solo alla fine
    ovviamente l'ho messo dentro un try-catch perchè può generare eccezioni

    Mi son scordato di dire una cosa forse importante, io sta lavorando su della grafica, oggetti awt e swing ... può centrare qualcosA?

    per spiegarvi ancora meglio ecco cosa dovrebbe fare quel metodo
    - cambio del colore di bg del jbutton di partenza (che ha l'icona del pezzo che vi è sopra)
    - atttesa ad es di 0.5 sec
    - chiamata a spostapezzo, che in pratica aggiorna la matrice die pezzi mettendo il pezzo di partenza dentro le coordinate di destinazione e mettendo nelle coordinate di partenza un pezzo vuoto; successivamente riscrittura dell'oggetto scacchiera che non fa altro che un for reimpostando le varie icone dei pezzi
    - attesa di 0.5 sec finale

    in sto mdo dovrei vedere tipo "al rallenty" l'esecuzione di un determinato set di mosse lette da un salvataggio

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    In swing non si usano le Thread.sleep perche' bloccano il thread dell'applicazione (quello che si occupa di fare il repaint) e spesso fa casino. Usa un Timer.

  8. #8
    Utente di HTML.it L'avatar di Fichico
    Registrato dal
    Nov 2002
    residenza
    Bologna
    Messaggi
    581
    e nel codice in questione come andrebbe usato? abbima provato in mille modi .. ma non c'è verso di farlo andare

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Beh. ci vuole una classe che implementa ActionListener, crei un timer(javax.swing.Timer), gli passi l'intervallo di tempo e l'actionListener. Lo fai partire quando ti pare a te e ogni tot secondi svolge le azioni scritte nel metodo actionPerformed dell'actionListener.
    Ti faccio un esempio (scritto in fretta).
    codice:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class TestTimer extends JFrame implements ActionListener {
        private String[] mosse;
        private int contatore;
        private boolean flag;
        private JLabel label;
        private Timer timer;
        private JButton bottone;
        
        public TestTimer() {
            //Istanzio le variabili
            mosse = new String[]{"aaaa","ssss","cccc"};
            contatore = 0;
            flag = false;
            label = new JLabel("...");
            label.setBackground(Color.LIGHT_GRAY);
            label.setOpaque(true);
            bottone = new JButton("Avvia il timer");
            bottone.addActionListener(this);
            timer = new Timer(1000, this);
            //Inserisco gli elementi nel frame
            JPanel p = new JPanel();
            p.add(label);
            p.add(bottone);
            this.add(p);
            //setto le variabili di rito
            this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            this.setSize(100,100);
            this.setVisible(true);
        }
        
        public void actionPerformed(ActionEvent e) {
            //Se clicco il bottone faccio questa parte
            if(e.getSource().equals(bottone)) {
                bottone.setEnabled(false);
                timer.start();
            //Se scatta il timer faccio questa
            } else if(e.getSource().equals(timer)) {
                if(flag) {
                    String tmp = mosse[contatore];
                    contatore++;
                    label.setText(tmp);
                    label.setBackground(Color.LIGHT_GRAY);
                } else {
                    label.setBackground(Color.RED);
                }
                flag = !flag;
                if(contatore==mosse.length) {
                    timer.stop();
                    contatore=0;
                    bottone.setEnabled(true);
                }
            }
        }
        
        public static void main(String[] args) {
            new TestTimer();
        }
        
    }

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.