Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Планировщик, Лучший алгоритм(for windows) 
V
    Опции темы
REZiaMIX
Дата 10.12.2009, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 3.11.2007

Репутация: нет
Всего: 4



В общем , есть некое задание(для задачи не важно) которое должно исполниться в некое время
Время задается очень "широким форматом":
промежутки дней , дней недели , минут , часов. И также определенные значения, например:
в каждый понедельник , вторник и четверг , каждый 10 минут , каждого часа в 2008 году.

Вот думаю как лучше в данном случае писать планировщик ? 
На данный момент планировщик ЧЧ:ММ:СС сделан так:
Есть список с событиями , события сортируются по отдалению от текущего времени.
Далее отсчитывается время до ближ события , и таймер ожидает промежуток. Далее также до конца списка.

Но для первого случая данная схема не так легко применима(но вполне реализуема).




--------------------
user posted image
PM MAIL   Вверх
chaos
Дата 10.12.2009, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



REZiaMIX, ну как мне кажется для начала непосредственного кодирования(программирования), необходимо определится с представлением твоего широкого формата

PM WWW   Вверх
17dufa
Дата 10.12.2009, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 2.3.2006

Репутация: 3
Всего: 5



для какого первого случая?
вообще классически 2 схемы: 
1. ваша, с "переходом" на следующее событие 
2. таймер каждые N секунд (/минут/часов) с проверкой какие события надо активизировать
PM MAIL   Вверх
GoldFinch
Дата 10.12.2009, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



REZiaMIX, сделай одноразовый таймер с интервалом равным времени до ближайшего события, если это время меньше максимального, или с максимальным если больше.
PM MAIL ICQ   Вверх
REZiaMIX
Дата 10.12.2009, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 3.11.2007

Репутация: нет
Всего: 4



Код

Число: стартчисло -> конечноечисло(и/или перечисление отдельных дней)
Месяц: стартмесяц -> конечныймесяц(и/или перечисление отдельных месяцев)

Секунды: отдельные секунды
Минуты: отдельные минуты
Часы: отдельные часы(и/или промежуток часов)
День недели: отдельные дни недели(или промежуток)


Т.е. задание допустим может выполняться по след. условию времени:
Код

Число: * -> * ( все числа)
Месяц: 1,3,5,6-8(1,3,5 месяц отдельно , 6-8 промежуток )

Секунды: 10,20
Минуты: 5 15 30 40 59
Часы: 12-14,16,18,20
День недели: 1,3,5


По такому условию событие будет выполняться в 10 и 20 секунды , в 5 15 30 40 59 минуты , 12 - 14 часов(промежуток) 16 18 20 часы. Каждый понедельник, среду и пятницу. В любые числа месяца , но только 1,3,5 и 6-8(промежуток) месяцы. smile

Добавлено @ 16:16
Цитата(17dufa @ 10.12.2009,  16:03)
2. таймер каждые N секунд (/минут/часов) с проверкой какие события надо активизировать

Каждую секунду проверять - не очень красивый выход.
Здесь больше вопрос в совместимости моего подхода с данной схемой промежутков времени.

Добавлено @ 16:17
Цитата(GoldFinch @ 10.12.2009,  16:08)
REZiaMIX, сделай одноразовый таймер с интервалом равным времени до ближайшего события, если это время меньше максимального, или с максимальным если больше.

В данный момент так и сделано , для первого случая где условия более простые.
(только точные секунды , минуты в независимости от других факторов)

Это сообщение отредактировал(а) REZiaMIX - 10.12.2009, 16:18


--------------------
user posted image
PM MAIL   Вверх
17dufa
Дата 10.12.2009, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 2.3.2006

Репутация: 3
Всего: 5



REZiaMIX, ну эти 2 схемы - это классика и я в них самих не вижу каких бы то ни было ограничений. вопрос в том насколько удачно тебе удастся реализовать функцию GetNextEventTime() при таком просторе в задании времен срабатывания событий.

PM MAIL   Вверх
REZiaMIX
Дата 10.12.2009, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 3.11.2007

Репутация: нет
Всего: 4



Цитата(17dufa @ 10.12.2009,  16:27)
REZiaMIX, ну эти 2 схемы - это классика и я в них самих не вижу каких бы то ни было ограничений. вопрос в том насколько удачно тебе удастся реализовать функцию GetNextEventTime() при таком просторе в задании времен срабатывания событий.

Ладно , тогда уже вопрос идет о том , как лучше реализовать для таких временных периодов такую функциюsmile
Код


class CPeriodFromTo
{
private:
    pval_t Start;
    pval_t End;
public:
    CPeriodFromTo();
    pval_t CPeriodFromTo::GetStart();
    void CPeriodFromTo::SetStart(pval_t _Value);

    pval_t CPeriodFromTo::GetEnd();
    void CPeriodFromTo::SetEnd(pval_t _Value);
};


class CFullPeriod
{
public:
    CVector <CPeriodFromTo> FromToList;
    CVector <CVector <pval_t> > SinglePeriodsList; 
};

class CPeriod
{
private:
    CFullPeriod day,month,year;
    CFullPeriod sec,min,hour;
    CFullPeriod dayofweek;
public:
...
};


Вот такая вот заготовка , в нее можно легко загнать все данные условия. Вот вопрос в том , как получить ближайшее время? Сортировать также все внутри каждого периода по отдалению от текущей даты. Получать для каждого CPeriod ближайшую внутреннюю дату , и потом уже среди списка сортировать все CPeriod ? 


--------------------
user posted image
PM MAIL   Вверх
17dufa
Дата 10.12.2009, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 2.3.2006

Репутация: 3
Всего: 5



ой. как спросишь. я ща насоветую, а те потом разгребать smile 
не, не берусь сказать. 
вариант - для каждого события рассчитать ближайшее время и отсортировать этот список мне лично импонирует (соответственно при срабатывании события высчитываем его следующее время срабатывания и вставляем в отсортированный список не нарушая сортировки. довольно элегантная схема и большие расчеты требуются только при запуске, когда анализируются все события)
лучше всего поэкспериментируй с 2-3 вариантами на прототипах и замерь какой вариант лучше. Заодно на прототипе вылезут все подводные камни рассматриваемых вариантов.
PM MAIL   Вверх
REZiaMIX
Дата 10.12.2009, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 3.11.2007

Репутация: нет
Всего: 4



Цитата(17dufa @ 10.12.2009,  16:42)
ой. как спросишь. я ща насоветую, а те потом разгребать smile 
не, не берусь сказать. 
вариант - для каждого события рассчитать ближайшее время и отсортировать этот список мне лично импонирует (соответственно при срабатывании события высчитываем его следующее время срабатывания и вставляем в отсортированный список не нарушая сортировки. довольно элегантная схема и большие расчеты требуются только при запуске, когда анализируются все события)
лучше всего поэкспериментируй с 2-3 вариантами на прототипах и замерь какой вариант лучше. Заодно на прототипе вылезут все подводные камни рассматриваемых вариантов.

Спасибо , так и сделаюsmile


--------------------
user posted image
PM MAIL   Вверх
xvr
Дата 11.12.2009, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Еще вариант:
  •  Время срабатывания задается некоторой программой (в виде байт-кода) для стековой машины. 
  •  Программа читает составляющие части даты/времени (отдельно месяцы, дни, часы и пр) и сравнивает их с заданными установками. (Перевод заданного диапазона времени срабатывания в байт-код довольно тривиален)
  •  Программа составлена так, что более продолжительные части времени (годы, месяцы, дни, часы и т.д.) проверяются сначала
  •  Вычисления выполняются по схеме short cut, т.е. если стало известно, что программа должна выдать 0, то она прерывается и выдает 0 немедленно, не вычисляя ничего дальше
  •  Интерпретатор байт кода запоминает самую последнюю прочтенную составляющую времени
  •  Если данная программа выдала 0, то снова она запускается на выполнение только когда значение, запомненное на предыдущем шаге, изменится

PM MAIL   Вверх
GoldFinch
Дата 11.12.2009, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



может все гораздо проще?
Код

boost::asio::deadline_timer timer(io_service);
timer.expires_at(boost::posix_time::time_from_string("2010-11-20 18:01:00.000"));
timer.wait();

PM MAIL ICQ   Вверх
xvr
Дата 11.12.2009, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(GoldFinch @ 11.12.2009,  12:53)
может все гораздо проще?
Код

boost::asio::deadline_timer timer(io_service);
timer.expires_at(boost::posix_time::time_from_string("2010-11-20 18:01:00.000"));
timer.wait();

Человеку нужны были диапазоны и хитрые комбинации из разных диапазонов и точных дат/времени. boost::asio::deadline_timer с этим справится? Мне кажется, что нет  smile 

PM MAIL   Вверх
GoldFinch
Дата 11.12.2009, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



xvr, я не проверял, но неудивлюсь если справится

PM MAIL ICQ   Вверх
xvr
Дата 11.12.2009, 19:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(GoldFinch @ 11.12.2009,  16:47)
xvr, я не проверял, но неудивлюсь если справится

Посмотрел на таймер в boost'е. Он поддерживает линейное понятие времени и не поддерживает никакие маски на временные интервалы. Так что это простой интервальный таймер. Автору никоим образом помочь не сможет, если только для отсчета заданных абсолютных интервалов. А превратить произвольную комбинацию масок времени в этот самый 'абсолютный интервал' и есть первоначальная проблема  smile 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0875 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.