Newsgroup: it.comp.java
Titolo: Problema nell'utilizzo di Timer e diun GregorianCalendar





Salve sto cercando di utilizzare un Timer per far partire un metodo con un 
ritardo specifico, e contemporaneamente vorrei memorizzare la data e l'ora di 
inizio conteggio del timer e della fine quando ho fatto partire il metodo, ma il 
problema č che la data č sempre la stessa nonostante la memorizzi in tempi 
diversi (e il timer funziona perchč c'č un effettivo ritardo nella sua 
esecuzione). Posto il codice:


 


import java.util.Timer;
import java.util.TimerTask;
import 
java.util.*;


 


public class Monitoraggio
{
    // Data inizio 
monitoraggio
    private GregorianCalendar  dataInizio = 
new GregorianCalendar();
    
    // Data 
fine monitoraggio
    public  GregorianCalendar  
dataFine = new 
GregorianCalendar();
           

    /**
     * Constructor for objects 
of class PuntoO
     */
    public 
Monitoraggio() { }


 


 /**
  * Methods
  */
  
 //Avvio del 
monitoraggio
 public void 
startMonitoring()
 {
  dataInizio.getInstance();  
//Ottengo la data di sistema
  System.out.println("Data iniziale 
del monitoraggio= " + dataInizio.getTime());
  Timer timer = new 
Timer();
  TimerTask task = new 
MyTimer(this);
  timer.schedule( task, (long) 5000 
);
  }
 
 //Arresto del 
monitoraggio
 public void 
stopMonitoring()
 {
  dataFine.getInstance();
 }
 
 //Classe 
inutile di prova
 public void 
printMonitoring()
 {
  System.out.println("Data iniziale 
del monitoraggio= " + 
dataInizio.getTime());
  System.out.println("Data finale del 
monitoraggio= " + dataFine.getTime());
 }
 
}


Mentre la classe MyTimer č:


 


import java.util.*;


public class MyTimer extends TimerTask
{
 private Monitoraggio 
monitor;
 /**
  * Constructor for objects of class 
Timer
  */
 public MyTimer(Monitoraggio 
monitor) { this.monitor = monitor; }
 
 public 
void run()
 {
  System.out.println("Scattato il 
timer..");
  monitor.stopMonitoring();
  System.out.println("Data 
finale del monitoraggio= " + 
monitor.dataFine.getTime());
  monitor.printMonitoring();
 }
}


E il main banale:


 


public static void main(String[] args)
    
{
     Monitoraggio m = new 
Monitoraggio();
     m.startMonitoring();


}


 


Cosě ci sono 2 problemi:


1-) La data č sempre uguale nonostante il timer funzioni e il ("Scattato il 
timer..") mi compaia proprio con 5 secondi di ritardo e la seconda la memorizzi 
effettivamente dopo 5 secondi..


2-) Il thread che ha creato per eseguire il metodo run nella classe MyTimer 
non riesco a farlo aspettare al thread principale, con il risultato che il prog 
mi esce prima che questo secodno thread finisca..


 


Come posso risolvere questi due problemi? Se qualcuno mi potrebbe 
indirizzare sulla buona strada gliene sarei grato..


 


Grazie, saluti.



  dataInizio.getInstance();  //Ottengo la data di sistema
Non mi pare un uso corretto. Io farei:
Calendar dataInizio, dataFine;
quando inizia il metodo vai a impostare l'istante
dataInizio=Calendar.getInstance();
che poi per esempio puoi leggere con getTime() o parsare con i metodi get(..)
Per la fine ripeti allo stesso modo.
Saluti
CarMas

   dataFine.getInstance();
Come primo cosa, tieniti sempre sotto mano javadoc(
http://java.sun.com/
j2se/1.4.2/docs/api/) può essere molto utile; mentre il tuo problema
si risolve come descritto da CarMas è aggiungo che puoi mantenere il
Gregorian Caledar, dato che è un'estenzione di calendar il modo
coretto e:
dataInizio = GregorianCalendar.getIstance();
dataFine = GregorianCalendar.getIstance();
Comunque se non ti serve per forza il calendario gregoriano passa al
calendar e stai attento ai mesi se devi impostarli a me capita spesso
di sbagliarmi.....
Bye
Kdk80

>   dataInizio.getInstance();  //Ottengo la data di sistema


Il 26/03/2007, kdk ha detto :

Sai che non sembra funzionare così come hai scritto? Mi dà 
quest'errore:
incompatible types
found   : java.util.Calendar
required: java.util.GregorianCalendar
        dataInizio = GregorianCalendar.getInstance();
Allora ho abbandonato l'idea del gregoriano e ho utilizzato un calendar 
semplice, che sembra finalmente funzionare..
Grazie per l'aiuto!
P.S. il javadoc (nel mio caso ancora 1.5) lo tengo sempre sott'occhio 
se no sarei perduto! Ma a volte mi dà più dubbi che certezze..
Rimane comunque il problema che così l'applicazione mi esce subito 
senza aspettare il thread che crea quando fa partire la classe MyTimer, 
se potessi avere un riferimento potrei usare il join() della classe 
Thread per fermare il thread principale per aspettarlo, ma così non 
riesco ad ottenerlo..
Sto provando ad usare la coppia wait e notify ma senza successo, mi dà 
un'eccezzione di tipo IllegalMonitorStateException, probabilmente 
perchè nella wait c'è scritto questa clausola: The current thread must 
own this object's monitor, o forse sbaglio io non so..
Suggerimenti?

        dataInizio = GregorianCalendar.getInstance();
Beh se e' solo per quello, prova con
GregorianCalendar dataInizio;
...
dataInizio = (GregorianCalendar)GregorianCalendar.getInstance();
Saluti
CarMas