2010-08-04 38 views
2

我有一個頻率和時間範圍,頻率必須被執行。 對於例如,如果當前時間是上午02時和頻率爲360分鐘,它具有到假設 因爲它剛過午夜,任務應該在裝置6 AM根據頻率和服務器啓動設置任務的開始

360分鐘12之後執行當前時間是服務器啓動從午夜開始。 因此,如果服務器開始於凌晨5點和frequncy是360任務應在上午6時

運行,但如果任務是凌晨5點和頻率是240,因爲它已經從午夜 接下來的運行應該是在上午8時通過240分鐘

如果服務器開始於上午10時和頻率爲300接着從午夜開始一次運行在上午05點ANS下如在上午10點計算,以便將在上午10點

立即開始範圍divded成4分之4,上午12時的時間流逝到6AM到12PM,12PM到6PM和6PM到第二天12AM 這是下面的代碼工作罰款爲240和360 fre當它的60頻率出現問題時會出錯。 其下面提供一些值:

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

也許把獎金提高到500會有幫助:) – Zabba 2010-08-10 06:23:17

+0

我正確的說,你發佈的函數是用來初始化一些需要在特定時間運行的任務嗎?該功能是否對啓動時的每個任務僅執行一次?所以,如果你調用函數,返回值是任務需要啓動的那一天的小時數? – n3utrino 2010-08-10 08:48:20

+0

@gabe: - 你是對的。這是爲了開始任務。該函數在init中只執行一次。 – GustyWind 2010-08-10 10:20:18

回答

0

我發現是..

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

這仍然看起來像一個可怕的很多代碼...你真的*當然*它需要這個複雜的? – 2010-08-17 10:14:38

+0

我認爲這是一個更精緻的。謝謝你的建議! – GustyWind 2010-08-17 10:18:49

2

是不是隨便說的情況:

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

(凡分工與整數運算完成的「期間-1」位搭上情況是正是時間,如第三測試情況下)

樣的情況:

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

對我來說,這一切看起來都很正確。你提到將時間範圍劃分爲四分之一,但我不明白這是多麼令人滿意或者相關......你是不是真的只是在談論每一種情況下的「自午夜以來的分鐘數」?請注意,按照我所表達的方式,您可以將其更改爲「自午夜以來的秒數」或「自午夜以來的毫秒數」 - 甚至「月初以來的分鐘數」。只要你有一致的起源和時間單位,它應該工作得很好。

(請注意,我指週期,而不是頻率 - 通常是一個更高的頻率意味着有事的時候,不

+0

從你的迴應中得到線索,我做了一些修改,它的工作 謝謝 – GustyWind 2010-08-17 09:58:47