Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.10.2014, 11:09   #1
Simply-Art
Программист и
Участник клуба
 
Аватар для Simply-Art
 
Регистрация: 29.10.2006
Сообщений: 1,265
По умолчанию Алгоритм расписания

Есть такая необходимость, в вычислении обновления. У меня есть текущая дата и дата последнего изменения файла. Есть список дней недели, в какие именно файл меняется либо просто указание что файл обновляется каждые N дней. Подскажите как узнать не "пропущено" ли изменение? Не могу придумать нормальный алгоритм

Пример 1
  • ФАЙЛ_1 последний раз изменен 29.10.2014 в 12-00
  • Данный файл обновляется в Пн. и Ср.
  • Сегодня 31.10.2014 15-00. Ближайший день предыдущего изменения должен был быть 29.10.2014 не позднее +/- часа. Следовательно файл был изменен по расписанию, все ок

Пример 2
  • ФАЙЛ_2 последний раз изменен 24.10.2014 в 00-30
  • Данный файл обновляется в Пт.
  • Сегодня 31.10.2014 15-00. Ближайший день предыдущего изменения должен был быть 31.10.2014 в интервале +/- час. Следовательно файл был изменен не по расписанию. Файл уже должен был быть изменен к этому времени.

Пример 3
  • ФАЙЛ_3 последний раз изменен 29.10.2014 в 00-30
  • Данный файл обновляется в каждый день
  • Сегодня 31.10.2014 00-00. Ближайший день предыдущего изменения должен был быть 30.10.2014. Следовательно файл был изменен не по расписанию. Он должен был быть изменен еще вчера 30.10.2014 в 00-30 +/- час

Пример 4
  • ФАЙЛ_4 последний раз изменен 30.10.2014 в 00-30
  • Данный файл обновляется в каждый день
  • Сегодня 31.10.2014 00-00. Ближайший день предыдущего изменения должен был быть 30.10.2014. А новое изменение сегодня в 00-30 +/- час. Еще есть время для изменения файла, все ок

Последний раз редактировалось Simply-Art; 31.10.2014 в 11:14.
Simply-Art вне форума Ответить с цитированием
Старый 31.10.2014, 11:34   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,318
По умолчанию

Как идея:
По времени изменения файла получить время ближайшего обновления
Время ближайшего обновления преобразовать в диапазон двухчасовой
Если время изменения и текущая дата лежат в этом диапазоне, то все нормально
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 31.10.2014, 11:36   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

А зачем гадать? Просто знаешь, что в среду и пятницу файл X будет изменен, значит в четверг и субботу делаешь проверку даты изменения/создания на день проверки(дата равна среде, пятнице) если такое есть, то файл обновили.

Более достовеным способом, будет проверка CRC суммы файла на след. день после обновления.
Человек_Борща вне форума Ответить с цитированием
Старый 07.11.2014, 06:17   #4
Simply-Art
Программист и
Участник клуба
 
Аватар для Simply-Art
 
Регистрация: 29.10.2006
Сообщений: 1,265
По умолчанию

Выходные были, не было времени ответить

Цитата:
Сообщение от BDA Посмотреть сообщение
Как идея:
По времени изменения файла получить время ближайшего обновления
Время ближайшего обновления преобразовать в диапазон двухчасовой
Если время изменения и текущая дата лежат в этом диапазоне, то все нормально
Можно на примере? А то не пойму как отслеживается время и что за преобразование в двухчасовой диапазон ...

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
А зачем гадать? Просто знаешь, что в среду и пятницу файл X будет изменен, значит в четверг и субботу делаешь проверку даты изменения/создания на день проверки(дата равна среде, пятнице) если такое есть, то файл обновили.

Более достовеным способом, будет проверка CRC суммы файла на след. день после обновления.
Причем тут гадания? При таком подходе мы узнаем о изменении только на следующий день, а если следующий день выходной? Нужно отследить изменения файла в любой день включения программы "мониторинга". Отсюда и анализ текущей даты. Есть еще идеи по поводу алгоритма?

Последний раз редактировалось Simply-Art; 07.11.2014 в 06:19.
Simply-Art вне форума Ответить с цитированием
Старый 07.11.2014, 14:28   #5
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Кто обновляет файлы? Вы или кто-то другой?
Я бы составил большие таблички - когда должны обновляться файлы и тупо сравнивать начиная с последней ближайшей даты. Таким образом основные несложные вычисления проводились бы однократно. Например, файл нужно обновлять каждый день. Составляем табличку:
06.11 10.00
07.11 10.00
08.11 10.00
09.11 10.00
и т.д.
Так как 06.11 уже прошло - убиваем эту дату в списке. Смотрим 07.11 совпало с седня? Совпало. Смотрим время. Думаем чего делать дальше.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 07.11.2014 в 14:32.
Utkin вне форума Ответить с цитированием
Старый 07.11.2014, 15:49   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Можно на примере? А то не пойму как отслеживается время и что за преобразование в двухчасовой диапазон ...
на примере расписания заданного такой константой
Код:
const
      {это расписание вс,...,сб - во вторник в 15:00, в четверг в 11:00}
      cSchedule: array[1..7] of TPoint = ((X:0;Y:0),(X:0;Y:0),(X:1;Y:15),
                                          (X:0;Y:0),(X:1;Y:11),(X:0;Y:0),(X:0;Y:0));
      {плюс-минус диапазон в часах}
      cDelta = 2; //плюс-минус диапазон в часах
Тогда если xFact - фактическая дата-время обновления (TDateTime), то проверять можно так
Код:
  n:=DayOfWeek(xFact); //день недели обновления
  if (cSchedule[n].X=1) and
     (xFact>=IncHour(DateOf(xFact),cSchedule[n].Y-cDelta)) and
     (xFact<=IncHour(DateOf(xFact),cSchedule[n].Y+cDelta)) then s:='обновилось точно по расписанию';
но не факт, что не пропущены проверки после этого. Нужно еще проверить до дня недели текущей даты нет ли пропущенных дней проверки
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 07.11.2014 в 16:00.
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Cоставление расписания mario1990 Помощь студентам 0 27.05.2011 12:37
Генерация расписания Pro0f Помощь студентам 0 23.05.2011 21:36
генератор расписания zebatic БД в Delphi 1 15.01.2011 15:48
Расписания ИТ-конференций GenniY Свободное общение 3 05.10.2009 16:01