Установите начало задачи в соответствии с частотой и запуском сервера. - PullRequest
2 голосов
/ 04 августа 2010

У меня есть частота и временной диапазон, с которым должна выполняться частота. Например, если текущее время составляет 2 часа ночи, а частота равна 360 минутам, следует предположить, что поскольку прошло только полночь, задание должно быть выполнено через 360 минут после 12 означает 6 часов утра

текущее время - время запуска сервера с полуночи. поэтому, если сервер запускается в 5 утра, а частота равна 360, задача должна быть запущена в 6 часов утра.

но если задача 5 утра и частота 240, так как она уже прошла 240 минут с полуночи следующий прогон должен быть в 8 утра

Если сервер запускается в 10:00, а частота - 300, то начиная с полуночи один запуск выполняется в 5:00 и следующий, как рассчитано в 10:00, поэтому он начнется немедленно в 10:00

.

Временные диапазоны делятся на 4 квартала, с 12:00 до 18:00 до 12:00, с 12:00 до 18:00 и с 18:00 до 12:00 следующего дня. Это код ниже, который работает нормально для частоты 240 и 360, но работает неправильно, когда его частота 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 ]

2 голосов
/ 13 августа 2010

Разве это не просто случай сказать:

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

(где деление выполняется с помощью целочисленной арифметики. Бит "period-1" предназначен для определения ситуации, когда время точно равно , например, третий тестовый пример ниже.)

Примеры ситуаций:

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

Все выглядит правильно для меня. Вы упоминаете, что делите интервалы времени на кварталы, но я не понимаю, насколько это желательно или уместно ... разве вы не просто говорите о "минутах с полуночи" в каждом случае? Обратите внимание, что, как я выразился, вы можете изменить его на «секунды с полуночи» или «миллисекунды с полуночи» - или даже «минуты с начала месяца»; до тех пор, пока у вас есть единое начало и единица времени, все должно работать нормально.

(Обратите внимание, что я имел в виду период, а не частоту - обычно более высокая частота означает, что что-то происходит чаще часто, а не меньше .)

0 голосов
/ 17 августа 2010

Я обнаружил, что ..

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...