PDA

View Full Version : [JAVA] Nuovo giorno, nuova azione


Napalm
06-03-2006, 15:14
Nel mio programmino dovrei creare un metodo che ad ogni volta che passa le ore 23:23:59, quindi siamo in un nuovo giorno, compia delle azioni. Ora non sò come impostare questo controllo.
Chi mi può dare una mano?
Grazie

NapalM

sottovento
06-03-2006, 15:26
Hai mille soluzioni:

1 - puoi usare i timer (per esempio, java.util.Timer o javax.swing.Timer, quest'ultimo mi piace di piu');

2 - Puoi creare un thread che fa solo quello: si sveglia, legge l'ora, fa quello che deve fare e si riaddormenta;

3 - Polling di brutto (l'ho messa ma non leggerla nemmeno);

4 - Aiuto al sistema operativo: molti sistemi operativi hanno la possibilita' di effettuare operazioni ad una data ora, potresti sfruttarla. Per esempio, puoi generare degli script, oppure scrivere metodi nativi;

High Flying
Sottovento

Napalm
06-03-2006, 15:38
Hai mille soluzioni:

1 - puoi usare i timer (per esempio, java.util.Timer o javax.swing.Timer, quest'ultimo mi piace di piu');

2 - Puoi creare un thread che fa solo quello: si sveglia, legge l'ora, fa quello che deve fare e si riaddormenta;

3 - Polling di brutto (l'ho messa ma non leggerla nemmeno);

4 - Aiuto al sistema operativo: molti sistemi operativi hanno la possibilita' di effettuare operazioni ad una data ora, potresti sfruttarla. Per esempio, puoi generare degli script, oppure scrivere metodi nativi;

High Flying
Sottovento


Escludendo gli ultimi 2...
il primo devo leggermi un pò di documentazione, il secondo è come l'avrei immaginato io.. il problema è che deve sempre fare il check della data.. almeno ogni minuto in modo da scattare al nuovo giorno... quindi sarebbe in ciclo while(true) che potrebbe gravare troppo sul SO? (in pratica al nuovo giorno devo copiare un file e rinominarlo)
Grazie :)

NapalM

Napalm
06-03-2006, 15:47
Leggendo qua e là ho messo sù una cosa del genere:


java.util.Timer provaTimer = new java.util.Timer();
provaTimer.schedule(new TimerTask() {
public void run() {
System.out.println("CIAO");
}
},new java.util.Date());


ora con la data come faccio, come già detto prima devo fare in modo che alle 00:00 di ogni giorno esegua cosa vado ad implementare nel metodo run... come posso fare?

NapalM

Napalm
06-03-2006, 16:25
java.util.Timer provaTimer = new java.util.Timer();
java.util.Date dataOggi = new java.util.Date();
final Calendar cal = new GregorianCalendar();
cal.setTime(dataOggi);
cal.add(Calendar.DAY_OF_YEAR,1);
final java.util.Date dataEsatta = cal.getTime();
provaTimer.schedule(new TimerTask() {
public void run() {
try{
cal.setTime(dataEsatta);
cal.add(Calendar.DAY_OF_YEAR,1);
dataEsatta = cal.getTime();
System.out.println("CIAO");

}catch (IOException e) {}
}
},dataEsatta);


In questo modo ad ogni inizio giorno mi dovrebbe stampare "CIAO"... è possibile o c'è qualche errore?

NapalM

Napalm
06-03-2006, 16:44
ho provate a fare delle modifiche per vedere se funziona:

java.util.Timer provaTimer = new java.util.Timer();
java.util.Date dataOggi = new java.util.Date();
cal = new GregorianCalendar();
cal.setTime(dataOggi);
cal.add(Calendar.SECOND,1);
dataEsatta = cal.getTime();
provaTimer.schedule(new TimerTask() {
public void run() {
System.out.println("DATA PRIMA:"+dataEsatta);
java.util.Date date = new java.util.Date();
SimpleDateFormat formatter = new SimpleDateFormat("(dd.MM.yyyy hh:mm:ss)-> ");
String timeLog = formatter.format(date);
cal.setTime(dataEsatta);
//cal.add(Calendar.DAY_OF_YEAR,1);
cal.add(Calendar.SECOND,1);
dataEsatta = cal.getTime();
System.out.println(timeLog+"CIAO");
System.out.println("DATA DOPO:"+dataEsatta);
}
},dataEsatta);


Il problema è che ho questo out:


DATA PRIMA:Mon Mar 06 16:40:35 CET 2006
DATA DOPO:Mon Mar 06 16:40:36 CET 2006
(06.03.2006 04:40:35)-> CIAO
CIAO
CIAO
CIAO


il prima passaggio è giusto poi successivamente non sò dove và a finire ( quel "CIAO" da solo non c'è da nessuna parte) ma non passo più dentro il metodo run() e poi ci mette più di 1 secondo fra un "CIAO" e l'altro... quale può essere il problema?

NapalM