реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Событийный таймер, Необходимо, чтобы сработал единожды в заданное время
haker_fox
сообщение Jun 29 2012, 01:08
Сообщение #1


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Доброго времени суток, уважаемые коллеги!

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

Заранее много много спасибо всем!!!)


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Jun 29 2012, 04:03
Сообщение #2


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



А зачему тут класс? Потом еще конструктор уничтожать. Обычную функцию с мьютексом можно поставить
CODE
bool addSchedule( uint8_t hour, uint8_t min, void* pFunc )
{
queueMutex.lock(); // получаем монопольный доступ к очереди заданий
// как-то добавляем задание в очередь
queueMutex.unlock(); // освобождаем доступ
}


--------------------
Выбор.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 02:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01331 секунд с 7
ELECTRONIX ©2004-2016