Newsgroup: it.comp.java
Titolo: thread exception o cos'altro?

Salve a tutti!!! Premesso che programmo forse da troppo poco in java per
capirlo nel modo dovuto, avrei bisogno di un aiutino!
Sto realizzando un simulatore con una applet... il mio problema e' bloccare
la simulazione in un qualsiasi momento! Mi spiego meglio... una volta
avviata una certa procedura scheduler si procede con un codice del genere :
for (numero_simulazioni)
 while ( t< tempo_a_disposizione)
   faccio_qualcosa ;
inutile aggiungere che le operazioni durano dai 10 ai 60 minuti, se non di
piu'.
Pensavo che se la classe principale aggiornasse una variabile ex. termina ,
con un controllo dentro il ciclo su qs variabile le cose potessero
funzionare... ma non e' cosi'...e' come se questa classe prendesse "il
potere" sulle altre! Neanche il destroy funziona, se non alla fine del
ciclo!
Volevo usare i thread... ma ci ho capito pochino... anche eprche' funzionano
quasi all'opposto dell'object pascal ....  Lo stesso per le eccezioni che
non so come fare sollevare ad un'altra classe...
Uso il jbuilder (ma solo per il debug ;) ) e devo compilare con versione
1.1.x , non 1.2
Grazie a chiunque possa darmi una dritta, anche qualche sito con esempi e'
ben accetto!(anche via mail!)
Valeria G.



Ciao,

per fare questo devi implementare una specie di Timer ovvero di un
processo che

viene avviato e "misura" il passare del tempo. Ho fatto una cosa del
genere su

uno degli articoli relativi al mio corso sui Thread su Dev pubblicato
poi anche

su MokaByte. Vediamo se riesco a descrivertelo in breve:

1) Definiamo una interfaccia che deve essere implementata dalla classe

che deve sentire lo scadere del Timer.

public interface TimerListener{


    public void timeElapsed();


}// fine


Le classi che utilizzano Il Timer dovranno implementare questa interfaccia
e definire

il metodo timeElapsed() che verra' chiamato al termine del timeout.

2) Creiamo il Timer

import    java.util.*;


public class Timer implements Runnable {


    private    int           
delay;    // Ritardo in millisecondi


    private    Thread   
runner;    // Processo corrente


    private    Vector   
ascs;        // Insieme degli ascoltatori


    public Timer(int delay){


        runner=null;


        this.delay=delay;


        ascs= new
Vector();


    }// fine


    public void run(){


        try{Thread.sleep(delay);}catch(InterruptedException
e){}


        notifica();


    }// fine


    public void start(){


        if(runner==null){


           
runner= new Thread(this);


           
runner.start();


        }


    }


    public void stop(){


        if(runner!=null){


           
runner.stop();


           
runner=null;


        }


    }


    public void addTimerListener(TimerListener
l){


        ascs.addElement(l);


    }// fine


    public void removeTimerListener(TimerListener
l){


        ascs.removeElement(l);


    }// fine


    private final void notifica(){


        for(int i=0;i<ascs.size();i++)


           
((TimerListener)(ascs.elementAt(i))).timeElapsed();


    }


}// fine


Qui possiamo sottolineare due cose:

1) Implemetiamo l'interfaccia Runnable in quanto vogliamo fermare e
riavviare il Thread senza dover

creare delle nuove istanze del Timer (ricordo che un Thread muore quando
termina il metodo run o

quando viene chiamato il metodo stop(). dopo morto non si puo' restartare
se non creando una nuova

istanza).

2) Al termine del tempo impostato viene chiamato il metodo timeElapsed()
di ogni ascoltatore che

si e' registrato al Timer.

Nel tuo case basterà far partire un Timer ogni volta che intendi
far partire il timeout. Se l'azione viene

eseguita nel tempo stabilito basterà chiamare il metodo stop()
che ferma il timer. Una sussessiva

chiamata al metodo start() fara' ripartire il timer. Se l'azione non
e' eseguita nel tempo stabilito il timer

chiamera' il metodo timeElapsed() della tua applicazione e farai le
azioni conseguenti.

Spero, nonostante l'improvvisazione e la fretta, di esserti stato utile

Bye

Max

 

 



--

+++++++++++++++++++++++++++++++++++++

  Ing. Massimo Carli

  IT Senior Developer

  Responsabile Sviluppo Tecnico E-TREE

     
http://www.e-tree.com


     
ca...@e-tree.com


  Technical Writer

     
http://www.infomedia.it


  Redattore Mokabyte

     
http://www.mokabyte.it


+++++++++++++++++++++++++++++++++++++

 






Ti ringrazio dell'aiuto...ma il timeout non va bene...
il problema e' infatti che la classe principale non sente alcun evento e
quindi non riesce ad impostare il timer se non alla fine della simulazione.
Non so se mi sono spiegata bene... Considera che la frame non riesce neanche
a sentire quando tento di chiudere con x :)))
Cmq credo che l'errore sia nel non avere utilizzato per questo simulatore un
thread....
grazie ancora :))
ciao ciao
Valeria G.