Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Событийный таймер
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
haker_fox
Доброго времени суток, уважаемые коллеги!

Для нужд автоматизации мне необходим таймер, который в заданное время вызовет единожды указанную ранее функцию. Реализация должна быть платформенно независимой. Сейчас отрабатываю вариант под Win, т.е. на embedded системах, где "все открыто" проблем особых не должно возникнуть.

Поскольку я пишу на Си++, решил сделать что-то вроде

CODE
class FVirtualTimer
{
public:
    FVirtualTimer( uint8_t, uint8_t, void* );
};

FVirtualTimer::FVirtualTimer( uint8_t hour, uint8_t min, void* pFunc)
{
// здесь реализация таймера под конкретную ОС/железо

// hour, min - время, при необходимости можно и дату добавить, принцип один и тот же
// pFunc - указатель на функцию, которую нужно вызвать
}

Вот тут у меня пока проблема. В WinAPI есть таймер с тайм-аутом. Можно, конечно брать текущее системное время, прибавлять его к таймату, полученному из hour и min, но какая при этом будет точность? Мне необходимо +-1 сек.
И, главное, как это реализовать?

Использовать буду как-то так
CODE
FVirtualTimer timer0( 23, 30, turnOnLight ); // включить свет в 22:30

FVirtualTimer timer1( 08, 15, turnOffLight ); // выключить свет в 08:15

// Остальной код


Примеры брал не из редактора, сразу вписывалс сюда, поэтому на мелкие синтаксические и грамматические ошибки прошу внимания не обращать)

При необходимости таймер может быть создан динамически с помощью new, это если система будет интерактивной.

По поводу реализации. Можно запустить отдельный поток, который будет "мониторить" системное время конкретного железа/ОС, и смотреть в очередь сообщений, которую ему "подсовывает" конструктор таймера. Как только время из очереди совпало с системным, берем из этой же очереди указатель на функцию и запускаем ее.

Достоинства реализации:
1. Мы не связываемся с мутными тайматуми.
2. Реализация предельно проста, точность зависит от "тормознутости системы" и точности аппаратных часов.

Минусы реализации:
1. Мы вводим поллинг на время, т.е. процессор "вхолостую" молотит в одтельном потоке. Для embedded ОС это, мне кажется, легко преодалеть, т.к. код оси открыт, можно свое событие добавить.


В общем, у меня пока такие вопросы:
1. "Нормально" ли реализован подход к делу?
2. Как более правильно можно в Win организовать такой таймер?

Заранее много много спасибо всем!!!)
haker_fox
А зачему тут класс? Потом еще конструктор уничтожать. Обычную функцию с мьютексом можно поставить
CODE
bool addSchedule( uint8_t hour, uint8_t min, void* pFunc )
{
queueMutex.lock(); // получаем монопольный доступ к очереди заданий
// как-то добавляем задание в очередь
queueMutex.unlock(); // освобождаем доступ
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.