Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it L'avatar di ghinz
    Registrato dal
    May 2001
    Messaggi
    211

    [JAVA] Timer: bug virtual machine???

    Gente mi sono scontrato con un problema legato all'utilizzo di un java.util.timer, descrivo brevemente:
    Applicazione con un timer che gira e fa un polling su una porta seriale, quando dalla seriale rileva un certo dato lo logga su disco con data e ora.
    Per test lancio l'applicazione e mentre gira mi metto a modificare la data e l'ora di windows per vedere come si comporta.
    Ad esempio: oggi è il 29 maggio, sposto la data al 30 e tutto funziona.
    Sposto la data all'1 giugno e il timer si blocca!!!
    Anzi, si blocca prima ancora di spostare la data, cioé prima di premere "applica"!!! In pratica io seleziono dal combo dei mesi il mese di giugno (sotto viene aggiornato il calendario dei giorni) e nel momento stesso in cui clicco sull'uno del primo giugno il mio timer si blocca (o viene terminato, killato, stoppato...).
    In pratica ho constatato che se clicco un numero di giorno inferiore a quello attuale, il timer del mio programma java viene distrutto!

    Un mio collega dice che i timer si basano sul timer di sistema e che la modifica di quest'ultimo potrebbe causare problemi alla JVM. Vabbè che uno non si mette sempre a giocare con le date, ma la possibilità c'è comunque!!

    Avete idee o suggerimenti?
    Grazie in anticipo
    ghinz

  2. #2

    J

    Beh direi che i tuoi colleghi ti dicono bene vedi devi capire che la JVM lavora con il TIMESTAMP della macchina se gli cambi l'ora sotto il giorno lui nn sa cosa fare nn ci capisce un cavolo e ti sembra k vada a farsi friggere.

  3. #3

    JAVA java.util.timer

    Beh direi che i tuoi colleghi ti dicono bene vedi devi capire che la JVM lavora con il TIMESTAMP della macchina se gli cambi l'ora sotto il giorno lui nn sa cosa fare nn ci capisce un cavolo e ti sembra k vada a farsi friggere.

  4. #4
    Utente di HTML.it L'avatar di ghinz
    Registrato dal
    May 2001
    Messaggi
    211
    Immaginavo...

    Questo però pregiudica il corretto funzionamento del mio programma che sui timer ci vive!
    È vero che non tutti i giorni gli utenti si mettono a giocare con le date, ma visto che il mio prg. deve girare 24 ore su 24 devo trovare un modo per rendere "immortale" il timer, anche se gli cambiano sotto la data di sistema (cosa che prima o poi può capitare).
    Qualche idea?

    PS: facendo le prove ho notato uno strano comportamento di Windows (uso il 98SE): la data di sistema cambia nel momento stesso in cui clicchi un giorno diverso nel calendario! NON quando premi il tasto applica! Strano vero?
    Ciao
    ghinz

  5. #5
    Hai provato ad usare Calendar o GregorianCalendar sempre dello stesso package?
    Blink@go

    "Non tutto quel che è oro brilla, Ne gli erranti sono perduti; Il vecchio ch'è forte non s'aggrinza, Le radici profonde non gelano.Dalle ceneri rinascerà un fuoco, L'ombra sprigionerà una scintilla, Nuova sarà la lama ormai rotta, E re quei ch'è senza corona."

    ------------
    Lang: java 1.4.1 Eclipse

  6. #6
    Utente di HTML.it L'avatar di ghinz
    Registrato dal
    May 2001
    Messaggi
    211
    In che senso?

    Ho presente le classi di cui parli, ma in che modo intenderesti usarle?
    ghinz

  7. #7
    Se ho capito bene c'è un while che looppa in infinito su un metodo che controlla la porta!
    se il messaggio viene ricevuto si prende l'ora corrente con calendar e la si mette sul log!
    o devi controllare la porta ad intervalli regolari?
    Blink@go

    "Non tutto quel che è oro brilla, Ne gli erranti sono perduti; Il vecchio ch'è forte non s'aggrinza, Le radici profonde non gelano.Dalle ceneri rinascerà un fuoco, L'ombra sprigionerà una scintilla, Nuova sarà la lama ormai rotta, E re quei ch'è senza corona."

    ------------
    Lang: java 1.4.1 Eclipse

  8. #8
    Utente di HTML.it L'avatar di ghinz
    Registrato dal
    May 2001
    Messaggi
    211
    No, immagino tu non conosca la classe Timer e TimerTask

    La classe Timer si occupa di far girare un metodo (che tu stesso definisci in una tua classe che deve implementare l'interfaccia TimerTask) ad una frequenza determinata. Puoi scegliere se farlo girare a intervallo fisso e no, ma non è questo il punto.
    Il problema è che la classe Timer crea un thread che si basa sul metodo wait() della classe Object per implementare il timer.
    Evidentemente il wait funziona leggendo l'orario di sistema e facendo una sottrazione tra l'orario attuale e quello in cui è stato fatto partire.

    Se io (utente bastardo) mi metto a modificare l'orario di sistema dall'esterno (da Windows ad esempio, ma anche da un'altra applicazione) il wait() perde il riferimento sul quale era partito e immagino che la virtual machine gestisca questa eccezione distruggendo il task del timer.

    Io sto cercando un metodo per ovviare a questo problema, magari implementando un qualcosa (mi veniva dire un altro timer :quipy: ) che verifichi che il timer sia sempre attivo ed in caso contrario lo rischeduli.

    Ciao, e grazie comunque per l'interessamento
    ghinz

  9. #9
    puoi fare una cosa!
    Leggere l'orario di sistema e prendere in considerazione solo i minuti!
    per esempio se la tua applicazione deve effettuare un controllo ogni 15 minuti tu implementerai un metodo che parte solo quando i minuti dell'orologio sono:
    x=ora di start,
    x+15,
    x+30,
    x+45,
    x+60=x!
    naturalmente devi escludere dal calcolo le ore!
    così se un utente bastardo cambia l'orario tutto il problema che avrai sarà di un'anticipazione o posticipazione del task!
    Se anche questo non fa al caso tuo non so cosa fare!

    Comunque sai se Timer è un Pattern? Vorrei saperne di più?
    Blink@go

    "Non tutto quel che è oro brilla, Ne gli erranti sono perduti; Il vecchio ch'è forte non s'aggrinza, Le radici profonde non gelano.Dalle ceneri rinascerà un fuoco, L'ombra sprigionerà una scintilla, Nuova sarà la lama ormai rotta, E re quei ch'è senza corona."

    ------------
    Lang: java 1.4.1 Eclipse

  10. #10
    Utente di HTML.it L'avatar di ghinz
    Registrato dal
    May 2001
    Messaggi
    211
    Bè, l'applicazione in questione è in polling su una porta seriale con un intervallo di circa mezzo secondo e poi il timer mica l'ho scritto io! Nel senso che essendo una classe del package java.util in teoria dovrei andare a modificarne il sorgente per renderla "utente bastardo safe". Cosa che potrei anche fare dopotutto...:adhone:

    Non ho idea di cos'è un Pattern, se puoi essere più chiaro magari ti posso dare qualche indicazione in più...

    Intanto grazie, ciao!
    ghinz

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.