Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    230

    Il mio Alarm si blocca

    Ciao

    ho creato la mia applicazione Alarm non ho errori a tempo di compilazione ne a run time.
    Il problema è che quando chiamo il metodo AlrmExecute funzional per la prima volta (quando clicco sul bottone Run di Eclipse9 e poi sembra bloccato e non mi mostra + neinete nella console , qualcuno potrebbe darmi una mano?
    Codice PHP:
    import java.util.Timer ;

    public class 
    Alarm {
        private 
    int s;
        private 
    int h;
        private 
    int m;
        private 
    int[]timeNow;
        private 
    Timer timer;
        private 
    AlarmTask almTsk;
        
    public 
    Alarm (int hourint min) { //hour, min ->alarm time set by the user
        
    h=hour;
        
    m=min;
        
    s=60;
        
    timer=new Timer();
        
    almTsk=new AlarmTask();
        
    timeNow=new int[2];
    }
    public 
    void AlarmExecute(){
        try{
        
    timer.scheduleAtFixedRate(almTsk0s*1000); //sample at 30s
        
    timeNow=almTsk.TimeNow();
        
    System.out.print(timeNow[0]); //dopo che ho fatto run sulla console mi compare una sola
        
    System.out.print(timeNow[1]); //volta l'ora, non dovrebbe comparire ogni 30s? 
        
    if(timeNow[0]==&& timeNow[1]==m){
            
    System.out.print("Alarm");
            
    StopAlarm();
        }
    }
    catch (
    IllegalArgumentException e1){
        
    System.out.println("delay is negative");
    }
    catch (
    IllegalStateException e2){
        
    System.out.println("task was already scheduled or cancelled, timer was cancelled");
    }
    }
    public 
    void StopAlarm (){
        
    timer.cancel();
    }

    }


    import java.util.Calendar;
    import java.util.TimerTask;

    public class 
    AlarmTask extends TimerTask{
        private 
    int[] timeNow;
        private 
    Calendar cal;
        
    public 
    AlarmTask(){
        
    timeNow=new int[2];
        
    cal=Calendar.getInstance();
        
    //System.out.print(cal.get(Calendar.HOUR_OF_DAY));
    }
        
    public 
    void run(){ //sample of time
            
    timeNow[0]=getHour();
            
    timeNow[1]=getMinute();
        }
    public 
    int getHour(){
            return 
    cal.get(Calendar.HOUR_OF_DAY);
            
    }
    public 
    int getMinute(){
            return 
    cal.get(Calendar.MINUTE);
    }    

    public 
    int[]TimeNow(){
        return 
    timeNow;
    }
        
        
    }

    ublic class Test {

        
    /**
         * @param args
         */
        
    public static void main(String[] args) {
            
    // TODO Auto-generated method stub
         
    Alarm a;
         
    a=new Alarm(23,20);
         
    a.AlarmExecute();
         
    }



  2. #2
    Ci sono diverse ragioni per cui il codice che hai scritto non può funzionare.

    Nel Task non calcoli l'ora e i minuti correnti, ma quelli del momento in cui istanzi la classe. Infatti crei un oggetto Calendar nel costruttore e poi continui a prendere da lì ora e minuti; per averli aggiornati devi invece istanziare ogni volta un nuovo Calendar.

    L'intervallo di esecuzione del Task lo hai impostato a 60 secondi e non 30 come vorresti tu; devi mettere s=30.

    Dopo aver fatto partire il timer, tu stampi ora e minuti facendoteli passare dal task, ma se vuoi stamparli ad ogni esecuzione del task, le stampe le devi mettere nel metodo run() del task stesso.

    Infine, la verifica del raggiungimento dell'ora desiderata la esegui una volta sola, all'inizio.
    Per eseguirla di continuo, puoi ad esempio, dopo aver fatto partire il task, fare un loop infinito la cui condizione di uscita sia appunto il raggiungimento dell'ora dell'allarme.

    Ciao,

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    230
    Originariamente inviato da interarete
    Ci sono diverse ragioni per cui il codice che hai scritto non può funzionare.

    Nel Task non calcoli l'ora e i minuti correnti, ma quelli del momento in cui istanzi la classe. Infatti crei un oggetto Calendar nel costruttore e poi continui a prendere da lì ora e minuti; per averli aggiornati devi invece istanziare ogni volta un nuovo Calendar.

    vediamo se ho capito: chiamo il costruttore di Alarm il quale da un istanza della classe Calendario a cal alle 20:00 per esempio.
    Quando voglio l'ora attuale mi viene stampata 20:00 perchè a quest'ora è stata istanziata la classe. Ho capito bene?




    L'intervallo di esecuzione del Task lo hai impostato a 60 secondi e non 30 come vorresti tu; devi mettere s=30.

    Ok distrazione

    Dopo aver fatto partire il timer, tu stampi ora e minuti facendoteli passare dal task, ma se vuoi stamparli ad ogni esecuzione del task, le stampe le devi mettere nel metodo run() del task stesso.

    In realtà le stampe delle ore le avevo messe per capire se il passaggio avveniva correttamente fra la classe AlarmTask e Alarm Execute.


    Infine, la verifica del raggiungimento dell'ora desiderata la esegui una volta sola, all'inizio.
    Per eseguirla di continuo, puoi ad esempio, dopo aver fatto partire il task, fare un loop infinito la cui condizione di uscita sia appunto il raggiungimento dell'ora dell'allarme.

    Si.
    grazie vado subito a provare i tuoi consigli.




    Ciao,

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    230

    Re: Il mio Alarm si blocca

    Originariamente inviato da puntino

    Ho seguito i tuoi consigli interarete, ma il problema e che quando abilito il ciclo infinito (con un while) per il controllo delle variabili ora e minuti la macchina si "impalla" come era giusto che sia.
    Probabilmente devo rifare il programma da capo hai qualche consiglio?
    Ciao e grazie


    Codice PHP:
    import java.util.Timer ;

    public class 
    Alarm {
        private 
    int s;
        private 
    int h;
        private 
    int m;
        private 
    int[]timeNow;
        private 
    Timer timer;
        private 
    AlarmTask almTsk;
        
    public 
    Alarm (int hourint min) { //hour, min ->alarm time set by the user
        
    h=hour;
        
    m=min;
        
    s=60;
        
    timer=new Timer();
        
    almTsk=new AlarmTask();
        
    timeNow=new int[2];
    }
    public 
    void AlarmExecute(){
        try{
        
    timer.scheduleAtFixedRate(almTsk0s*1000); //sample at 30s
        
    timeNow=almTsk.TimeNow();
        while (
    timeNow[0]!=&& timeNow[1]!=m){ 
        
    System.out.print(timeNow[0]); //dopo che ho fatto run sulla console mi compare una sola
        
    System.out.print(timeNow[1]); //volta l'ora, non dovrebbe comparire ogni 30s? 
        
    if(timeNow[0]==&& timeNow[1]==m){
            
    System.out.print("Alarm");
            
    StopAlarm();
        }
        
    timeNow=almTsk.TimeNow();  
        }
    }
    catch (
    IllegalArgumentException e1){
        
    System.out.println("delay is negative");
    }
    catch (
    IllegalStateException e2){
        
    System.out.println("task was already scheduled or cancelled, timer was cancelled");
    }
    }
    public 
    void StopAlarm (){
        
    timer.cancel();
    }

    }


    import java.util.Calendar;
    import java.util.TimerTask;

    public class 
    AlarmTask extends TimerTask{
        private 
    int[] timeNow;
        private 
    Calendar cal;
        
    public 
    AlarmTask(){
        
    timeNow=new int[2];
            
    }
        
    public 
    void run(){ //sample of time
            
    cal=Calendar.getInstance();
            
    timeNow[0]=getHour();
            
    timeNow[1]=getMinute();
        }
    public 
    int getHour(){
            return 
    cal.get(Calendar.HOUR_OF_DAY);
            
    }
    public 
    int getMinute(){
            return 
    cal.get(Calendar.MINUTE);
    }    

    public 
    int[]TimeNow(){
        return 
    timeNow;
    }
        
        
    }

    ublic class Test {

        
    /**
         * @param args
         */
        
    public static void main(String[] args) {
            
    // TODO Auto-generated method stub
         
    Alarm a;
         
    a=new Alarm(23,20);
         
    a.AlarmExecute();
         
    }



  5. #5
    Invece il problema è che il tuo ciclo finisce subito e quindi il thread dell'allarme prosegue all'infinito. Infatti la condizione che hai messo nel while ti fa uscire dal ciclo appena l'ora è uguale a quella dell'allarme, anche se i minuti sono diversi. Per fare in modo che funzioni, devi sostituire l'and con un or:

    codice:
    while (timeNow[0]!=h || timeNow[1]!=m)
    Ciao,

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    230
    Innanzitutto ti ringrazio per l'aiuto che mi stai offrendo.
    Nel while ci vuole or anzichè and, errori da pivello che non dovrei commettere....
    Cmq il programma che ho implementato non va bene proprio a causa del controllo da eseguire attraverso il while, perchè si innesca un ciclo infinito che satura la CPU fino all 99%, devo pensare ad un'altra soluzione che mi elimina questo problema.
    Probabilmente dovrò riscrivere il corpo di AlarmTask e AlarmExecute.

    Ciao e grazie ancora.

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 © 2026 vBulletin Solutions, Inc. All rights reserved.