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

    come inserire una pausa tra un'istruzione e un'altra

    Salve a tutti, mi sono appena iscritto al forum. Sto sviluppando un'applicazione grafica in Java per la mia tesi di laurea in informatica. Si tratta della simulazione del problema di Monty Hall (non so se qualcuno di voi ne ha sentito parlare) e vorrei che venisse mostrato lo svolgimento del gioco attraverso vari step, con una pausa (ad es. di 3 sec) tra uno step e l'altro. Ho provato ad inserire prima di ogni istruzione il metodo thread.sleep(3000) ma il risultato non è quello che mi aspettavo; invece di attendere 3 sec prima di ogni istruzione, passa un tempo pari alla somma di tutte le sleep() e solo dopo vengono eseguite normalmente tutte le istruzioni.
    Spero di essere stato chiaro e che qualcuno di voi abbia idea di come si possa risolvere il problema. Grazie in anticipo.

    PS. se è necessario spiegherò anche in cosa consiste il gioco e posterò parte del codice.

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    Re: come inserire una pausa tra un'istruzione e un'altra

    Originariamente inviato da Gollum87
    Ho provato ad inserire prima di ogni istruzione il metodo thread.sleep(3000) ma il risultato non è quello che mi aspettavo; invece di attendere 3 sec prima di ogni istruzione, passa un tempo pari alla somma di tutte le sleep() e solo dopo vengono eseguite normalmente tutte le istruzioni.
    :master: Prova a postare il pezzo di codice in questione :master:
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    ci sono tre porte: dietro una c'è un automobile, le altre due nascondono una capra. le ho implementate con il CardLayout, in pratica sono tre pannelli (cardPanels) contenenti una label (auto o capra) e sovrapposto ad essa un bottone che rappresenta una porta chiusa.
    le porte vengono aperte usando il metodo next() di cardlayout e io vorrei che si possano vedere una alla volta, perchè altrimenti è troppo veloce e non si capisce nulla

    codice:
    U=gen.nextInt(3); //numero intero pseudo-casuale della porta con l'automobile (0,1,2)
    X=gen.nextInt(3); //numero intero pseudo-casuale della prima porta scelta dal giocatore (0,1,2) 
    if (X==U) //se il giocatore ha scelto la porta con l'automobile 
    V=(U + 1 + gen.nextInt(2)) % 3; //il conduttore apre una a caso delle due restanti 
    else 
    V=3-U-X; //altrimenti apre l'unica restante
     
    try{ 
    Thread.sleep(3000); 
    } catch (InterruptedException e){}
     
    panelsLayout.next(cardPanels[V]); //apre la porta V
    W=gen.nextDouble(); //numero reale psuedo-casuale tra 0 e 1 
    if (W>=0.0 && W<(1-p)) //se W è compreso tra 0 e 1-p 
    Y=X; //il giocatore non cambia porta 
    else 
    Y=3-X-V; //il giocatore cambia porta
     
    try{ 
    Thread.sleep(3000); 
    }catch (InterruptedException e){}
    
    panelsLayout.next(cardPanels[Y]); //apre la porta Y
    volevo allegare anche un'immagine ma mi dice che il file è troppo grande, comunque penso abbiate capito di che si tratta

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    E questo codice dove si trova? Viene richiamato in seguito a qualche evento? Sei nel contesto EDT?
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  5. #5
    Si, è nel metodo actionPerformed del listener di un pulsante.
    Per creare la GUI sto utilizzando il plugin di eclipse Jgloo. La classe principale è NewJFrame che estende JFrame, e il pulsante viene creato nel metodo initGUI() di questa classe. Quindi credo di essere nel contesto dell'EDT.

    Ecco il codice:
    codice:
    public static void main(String[] args) {
    		SwingUtilities.invokeLater(new Runnable() {
    			public void run() {
    				NewJFrame inst = new NewJFrame();
    				inst.setLocationRelativeTo(null);
    				inst.setVisible(true);
    			}
    		});
    	}
    
    	public NewJFrame() {
    		super();
    		initGUI();

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Gollum87
    è nel metodo actionPerformed del listener di un pulsante.
    Allora lì in quel momento sei nel contesto del EDT (event dispatch thread). E quindi non va bene. Se tieni tu "impegnato" il EDT con dei sleep() la tua interfaccia utente rimane "congelata".
    Pertanto no, non è l'approccio giusto.

    Vuoi eseguire "qualcosa" ogni tot di tempo? Ci sono dei timer appositi.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Ho capito. Ho provato ad usare un timer (javax.swing.timer), solo che il "qualcosa" che devo eseguire non è sempre lo stesso, sono varie fasi sequenziali che però vorrei venissero eseguite con un intervallo di tot secondi tra ognuna, cioè prima generare il numero casuale della porta con l'auto e della prima porta scelta dal giocatore, poi far vedere che il conduttore apre una porta, poi il giocatore cambia porta o sceglie la stessa, ecc... Quindi l'ho trovato un po complicato da gestire con il timer e l'ho scartata come possibile soluzione, però se sai dirmi come potrei risolvere te ne sono grato

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Gollum87 solo che il "qualcosa" che devo eseguire non è sempre lo stesso, sono varie fasi sequenziali che però vorrei venissero eseguite con un intervallo di tot secondi tra ognuna
    Allora devi mantenere uno "stato" che indica quale operazione deve eseguire al prossimo evento di timing.

    ogni timing:
    Se stato X fai blabla, imposta stato Y
    Se stato Y fai bloblo, imposta .....
    ecc...

    Tutto qui.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    si ho pensato anche io che debba fare qualcosa del genere, anzi ci avevo anche provato ma forse avrò fatto qualche errore, comunque provo cosi e ti faccio sapere... grazie andbin

  10. #10
    ok in questo modo ho ottenuto quello che volevo, ora devo fare in modo da eseguire più partite del gioco, dato che si tratta di una simulazione, cioè:
    partita 1: avvia il timer, svolgi le varie fasi del gioco, arresta il timer
    partita 2: riavvia il timer, svolgi le varie fasi del gioco, arresta il timer
    ... e cosi via
    tutto ciò parte sempre alla pressione di un pulsante. Riporto il codice aggiornato:

    codice:
    /*classe interna che esegue la simulazione e calcola la probabilità teorica 
    quando si fa click su Start*/
    	Timer t;
    	class StartSimListener implements ActionListener{ 
    		public void actionPerformed(ActionEvent evt){
    			t=new Timer(3000,new GameStep());
    			t.start();
    		}
    	}
    
    	class GameStep implements ActionListener{
    		int stato;
    		int nPartite;
    		double p;
    		int nVittorie, nSconfitte;
    
    		public GameStep(){
    			stato=0;
    			nPartite=Integer.parseInt(jComboBox1.getSelectedItem().toString());
    			try{
    				p=Double.parseDouble(jTextField3.getText());
    				if (p<0.0 || p>1.0) throw new NumberFormatException();
    			}
    			catch(NumberFormatException e){
    				JOptionPane.showMessageDialog(null, "Il valore di p deve essere un numero reale compreso tra 0 e 1", "Errore", JOptionPane.ERROR_MESSAGE);
    				return;
    			}
    			nVittorie=0;
    			nSconfitte=0;
    		}
    
    		public void actionPerformed (ActionEvent evt){
    
    			double W; //variabile aleatoria uniforme in (0,1) per stabilire il valore di Y
    			int pVittorie,pSconfitte;	   			//percentuale di vittorie e di sconfitte
    			double probVittoria, probSconfitta; 	//probabilità teorica di vittoria e di sconfitta
    			Random gen=new Random();				//generatore di numeri pseudo-casuali
    
    			switch (stato){
    			case 0:{.... stato=1}
    ...
    dovrei utilizzare un ciclo for, ma cosa ci devo mettere all'interno?

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.