Доброго времени суток, уважаемые коллеги!
Для нужд автоматизации мне необходим таймер, который в заданное время вызовет единожды указанную ранее функцию. Реализация должна быть платформенно независимой. Сейчас отрабатываю вариант под 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 организовать такой таймер?
Заранее много много спасибо всем!!!)
Выбор.