so_4: Версия 4.2.6. Форматы обработчиков событий

В предыдущих версиях SObjectizer-а обработчики событий могли иметь один из следующих форматов:
void  A::evt( const event_data_t & );
void  A::evt_handler(
  const so_4::rt::event_data_t &,
  const msg_type * cmd );
void  A::evt_handler(
  const so_4::rt::event_data_t &,
  msg_type * cmd );
Практика использования SObjectizer-а показала, что в большинстве случаев аргумент типа so_4::rt::event_data_t не используется.

В v.4.2.6 обработчики событий могут иметь один из следующих дополнительных форматов:

void  A::evt();
void  A::evt_handler(
  const so_4::rt::event_data_t &,
  const msg_type & cmd );
void  A::evt_handler(
  const msg_type * cmd );
void  A::evt_handler(
  const msg_type & cmd );
Т.е. добавлена возможность оказаться от получения аргумента типа so_4::rt::event_data_t и возможность получать ссылку на инцидент события, а не указатель.

Для описания обработчиков событий, которые имеют формат

void  A::evt();
должен использоваться макрос SOL4_EVENT(). Для описания обработчиков других форматов должен использоваться макрос SOL4_EVENT_STC() (STC расшифровывается как subcription type check, т.е. выполнение проверки типа инцидента при подписке).

Появление дополнительных форматов обработчиков событий упрощает написание агентов. Например, обработчик начала работы агента может выглядеть так:

class a_my_t : public so_4::rt::agent_t
{
  ...
  void
  evt_start();
  ...
};
SOL4_CLASS_START( a_my_t )
  ...
  SOL4_EVENT( evt_start )
  ...
SOL4_CLASS_FINISH()
А обработчик события, который заинтересован только в инциденте, может выглядеть, например, так:
class a_my_t : public so_4::rt::agent_t
{
  ...
  struct  msg_my_data { ... };
  
  void
  evt_my_data( const msg_my_data & cmd );
  ...
};
SOL4_CLASS_START( a_my_t )
  ...
  SOL4_MSG_START( msg_my_data, a_my_t::msg_my_data )
  SOL4_MSG_FINISH()
  
  SOL4_EVENT_STC( evt_my_data, a_my_t::msg_my_data )
  ...
SOL4_CLASS_FINISH()

Ссылка на экземпляр инцидента

С обработчиками событий, которые получают ссылку на инцидент связаны две особенности:

SOL4_EVENT_STC vs. SOL4_EVENT_WITH_INCIDENT_TYPE

Макрос SOL4_EVENT_WITH_INCIDENT_TYPE() позволял описывать обработчики событий, которые получали неконстантный указатель на инцидент события. В общем случае это не правильно. Т.к. сообщение может привести к параллельному запуску нескольких разных событий, которые изменяя объект-инцидент смогут непредстказуемо влиять друг на друга. Поэтому, более правильно создавать обработчики событий, которые получают константный указатель (ссылку) на инцидент.

Макрос SOL4_EVENT_WITH_INCIDENT_TYPE() оставлен в v.4.2.6 в неизменном виде, чтобы полностью сохранить работоспособность написанного ранее кода. Поскольку оказалось, что в некоторых случаях использовались как раз обработчики событий с неконстантными указателями на инцидент.

Но при использовании SObjectizer-а, начиная с v.4.2.6, рекомендуется использовать макрос SOL4_EVENT_STC(), т.к.:


Документация по SObjectizer v.4.4 'Тебуломста'. Последние изменения: Thu Sep 18 10:26:48 2008. Создано системой  doxygen1.5.6 Intervale SourceForge.net Logo