2010-08-04 5 views
2

J'ai une fréquence et une plage de temps avec lesquelles la fréquence doit être exécutée. Par exemple, si l'heure actuelle est deux heures et la fréquence est de 360 ​​minutes, il faut supposer que puisqu'il vient de passer minuit, la tâche doit exécuter à 360 minutes après 12 moyens 6 heuresDéfinir le début de la tâche en fonction de la fréquence et du démarrage du serveur

l'heure actuelle est démarrage du serveur heure à partir de minuit. donc si le serveur commence à 5h du matin et frequncy est 360 la tâche doit être exécutée à 6h du matin

mais si la tâche est 5 heures et la fréquence est de 240, car il a déjà passé 240 minutes de minuit la prochaine course devrait être à 8 heures

Si le serveur démarre à 10 heures et la fréquence est de 300, puis à partir de minuit, une course est écoulé à 5h du matin ans suivant calculé à 10 heures alors commencera immédiatement à 10 heures

les plages de temps sont divded en 4 trimestres, 12H de 6h à 12h, de 12h à 18h et de 18h à 12h le jour suivant Ceci est le code ci-dessous qui fonctionne bien pour 240 et 360 fre mais ne va pas quand sa fréquence est de 60. Certaines valeurs qui sont fournies ci-dessous:

stNow----serverTime 
sElapsed ---time elapsed from midnight 
currFreq ----frequecy 
    protected int _getInitWorkerTime() 
    { 
     int vRun=0; 
     STime stNow= new STime(PWMSystem.newDate()); 
     int currFreq = _findAlertFrequency()/60; 
     int sElapsed =Constants.MINUTES_PER_DAY-stNow.elapsedMinutes(STime.midnight); 
     _log.error("now time as 24------"+stNow.getHourNo24()); 
     _log.error("now currFreq------"+currFreq); 
     _log.error("now sElapsed-----"+sElapsed); 
     if(sElapsed == 1440) 
      sElapsed=0; 
     if(stNow.getHourNo24()>=0 && stNow.getHourNo24()<=6) 
     { 
      _log.error("now time as 24-inside cond-1-----"+stNow.getHourNo24()); 
       if(currFreq>sElapsed) 
        vRun= currFreq-sElapsed; 
       else 
        vRun= -(currFreq-sElapsed); 
     } 
     if(stNow.getHourNo24()>6 && stNow.getHourNo24()<=12) 
     { 
      _log.error("now time as 24-inside cond-2-----"+stNow.getHourNo24()); 
      if(currFreq>sElapsed) 
        vRun=360-(currFreq-sElapsed); 
       else 
        vRun=360-(-(currFreq-sElapsed)); 
     } 
     if(stNow.getHourNo24()>12 && stNow.getHourNo24()<=18) 
     { 
      _log.error("now time as 24-inside cond-3-----"+stNow.getHourNo24()); 
      if(currFreq>sElapsed) 
        vRun=720-(currFreq-sElapsed); 
       else 
        vRun=720-(-(currFreq-sElapsed)); 
     } 
     if(stNow.getHourNo24()>18 && (stNow.getHourNo24()<=24 ||stNow.getHourNo24()<=0)) 
     { 
      _log.error("now time as 24-inside cond-4-----"+stNow.getHourNo24()); 
      if(currFreq>sElapsed) 
        vRun=1080-(currFreq-sElapsed); 
       else 
        vRun=1080-(-(currFreq-sElapsed)); 
     } 
      // vRun=_MAX_FREQUENCY_DELAY_IN_SEC+ sElapsed*60+_findAlertFrequency()+_BOOT_DELAY_SECONDS_START;*/ 
     //vRun=stNow.elapsedMinutes(STime.midnight)*60+_findAlertFrequency()+_BOOT_DELAY_SECONDS_START; 
     return (vRun*60 + _BOOT_DELAY_SECONDS_START);  
    } 
+2

Peut-être augmenter la prime à 500 aidera :) – Zabba

+0

Ai-je raison de dire que la fonction que vous avez affichée est utilisée pour initialiser certaines tâches qui doivent être exécutées à un moment donné? La fonction est-elle exécutée une seule fois pour chaque tâche au démarrage? Donc, si vous appelez la fonction, la valeur de retour est l'heure du jour où la tâche doit commencer? – n3utrino

+0

@gabe: - vous avez raison. Ceci est pour le début des tâches. Cette fonction s'exécute seulement une fois à init. – GustyWind

Répondre

0

J'ai trouvé être ..

protected int _getInitWorkerTime() 
{ 
     int vRun = 0; 
     STime stNow = new STime(PWMSystem.newDate()); 
     int currFreq = _findAlertFrequency()/Constants.SECONDS_PER_MINUTE; 
     int sElapsed = Constants.MINUTES_PER_DAY- stNow.elapsedMinutes(STime.midnight); 
     int runsCompleted = sElapsed/currFreq; 
     int remainLeft = (runsCompleted + 1) * currFreq; 


       if (remainLeft > sElapsed) 
        vRun = remainLeft - sElapsed; 
       else 
        vRun = sElapsed - remainLeft; 


return (vRun * 60 + _BOOT_DELAY_SECONDS_START); 
+0

Cela ressemble encore à beaucoup de code ... êtes-vous vraiment * Sûr * il doit être aussi complexe? –

+0

Je pense que c'est un plus raffiné.Merci de suggestion !!! – GustyWind

2

est-il pas juste une affaire de dire:.

int nextTime = ((timeSinceMidnight/(period-1)) + 1) * period; 

(Si la division se fait avec l'arithmétique des entiers Le bit « période-1 » est pour attraper la situation où il est exactement à temps, comme le troisième cas de test ci-dessous)

situations exemples:.

Period  Minutes since midnight  Result 
360   120 (2am)      360 (6am) 
240   300 (5am)      480 (8am) 
300   600 (10am)     600 (10am)  

Tout me semble correct. Vous parlez de fourchettes de temps divisées en quarts, mais je ne vois pas en quoi cela est souhaitable ou pertinent ... n'êtes-vous pas en train de parler de «minutes depuis minuit» dans tous les cas? Notez que de la façon dont je l'ai exprimé, vous pouvez le changer en "secondes depuis minuit" ou "millisecondes depuis minuit" - ou même "minutes depuis le début du mois"; Tant que vous avez une unité d'origine et de temps cohérente, cela devrait fonctionner correctement.

(Notez que je l'ai fait référence à la période plutôt que la fréquence - normalement une fréquence plus élevée signifie que quelque chose arrive plus souvent, pas moins .)

+0

En prenant l'indice de votre réponse j'ai fait quelques modifications et cela a fonctionné Merci – GustyWind

Questions connexes