Диспетчеру run-time SObjectizer-а необходимы средства для работы с отложенными и переодическими сообщениями. Точность отсчета времени для различных задач может сильно различаться. Для некоторых задач необходима точность до милли- или микросекунд, для некоторых достаточно точности в секундах. Механизмы диспетчеризации для отсчета времени практически не играют роли.
Поэтому в SObjectizer-е разделены понятия диспетчера (интерфейс so_4::rt::dispatcher_t) и таймера (интерфейс so_4::timer_thread::timer_thread_t) для того, чтобы их можно было сочетать в различных комбинациях.
Все реальные таймеры для SObjectizer-а должны быть производными от timer_thread_t.
Настоящий таймер не обязательно должен быть реализован в виде нити. Название timer_thread_t сложилось исторически. Важно, что диспетчер запускает таймер при своем старте посредством метода timer_thread_t::start() и останавливает таймер при завершении работы посредством timer_thread_t::shutdown(). Т.к. при реализации таймера в виде отдельной нити сложно обеспечить, чтобы выход из shutdown() означал завершение работы нити таймера, то введен метод wait(). Диспетчер вызывает wait() сразу после вызова shutdown() и возврат из wait() означает, что таймер полностью остановлен и все ресурсы, захваченные таймером, освобождены.
Когда у диспетчера вызывается метод push_delayed_msg диспетчер передает сообщение таймеру. Далее таймер отвечает за хранение экземпляра сообщения и за определение времени когда сообщение должно быть диспетчеризировано. Доставка сообщения на диспетчеризацию осуществляется функцией so_4::api::_deliver_msg(). Если сообщение переодическое, то таймер отвечает за последующие переодические обращения к so_4::api::_deliver_msg().
При дерегистрации агента run-time вызывает у диспетчера метод destroy_all_agent_msg. Диспетчер вызывает метод destroy_all_agent_msg() у таймера. В этом методе таймер должен уничтожить все экземпляры отложенных и переодических сообщений данного агента. В противном случае агент не сможет быть дерегистрирован, т.к. каждый существующий экземпляр сообщения агента увеличивает количество ссылок на агента. А дерегистрация агента осуществляется только когда количество ссылок на агента обнуляется.
Открытые члены | |
virtual ret_code_t | start ()=0 |
Запустить нить таймера. | |
virtual void | shutdown ()=0 |
Дать сигнал нити таймера завершить работу. | |
virtual void | wait ()=0 |
Ожидать полного завершения работы нити таймера. | |
virtual void | push_msg (const so_4::rt::msg_data_t &msg_data, unsigned int delay, unsigned int period=0)=0 |
Поставить отложенное или переодическое сообщение в очередь. | |
virtual void | destroy_all_agent_msg (const std::string &agent_name)=0 |
Изъять все ожидающие сообщения данного агента. |
virtual void so_4::timer_thread::timer_thread_t::push_msg | ( | const so_4::rt::msg_data_t & | msg_data, | |
unsigned int | delay, | |||
unsigned int | period = 0 | |||
) | [pure virtual] |
Поставить отложенное или переодическое сообщение в очередь.
msg_data | Экземпляр сообщения. |
delay | Для переодического сообщения указывает время, через которое сообщение должно возникнуть в первый раз. |
period | Отличен от 0 для переодических сообщений. |
Замещается в so_4::timer_thread::ace_timer_queue_adapter::impl::timer_thread_t.
Используется в so_4::disp::one_thread::impl::dispatcher_t::push_delayed_msg().
virtual void so_4::timer_thread::timer_thread_t::destroy_all_agent_msg | ( | const std::string & | agent_name | ) | [pure virtual] |
Изъять все ожидающие сообщения данного агента.
agent_name | Имя агента, чьи сообщения должны быть изъяты из таймера. |
Замещается в so_4::timer_thread::ace_timer_queue_adapter::impl::timer_thread_t.
Используется в so_4::disp::one_thread::impl::dispatcher_t::destroy_all_agent_msg().
Документация по SObjectizer v.4.4 'Тебуломста'. Последние изменения: Thu Sep 18 10:26:50 2008. Создано системой 1.5.6 |