SObjectizer — это небольшой фреймворк для упрощения разработки многопоточных приложений на C++. SObjectizer позволяет создавать объекты-агенты, которые взаимодействуют друг с другом только посредством асинхронных сообщений. Сам SObjectizer берет на себя задачи диспетчеризации сообщений и предоставление агентам рабочего контекста для обработки получаемых сообщений.
Проект живет на SourceForge, распространяется под трехпунктной BSD-лицензией.
Если говорить кратко, то в версии 5.5.5 появилось следующее:
вспомогательные шаблонные методы introduce_coop и introduce_child_coop, упрощающие создание и регистрацию коопераций;
возможность использования туплов в качестве типов сообщений;
фильтры для сообщений, которые позволяют анализировать содержимое сообщений и отбрасывать те из них, которые не интересны агенту получателю;
несколько новых примеров.
Так же подготовлены две новые части серии презентаций “Dive into SObjectizer-5.5”, более подробно рассказывающие о состояниях агентов и кооперациях агентов (все имеющиеся презентации собраны здесь).
Поскольку довольно часто спрашивают об отличиях SO-5 от CAF, пришлось написать небольшой текст на эту тему. На Runlish-е, правда. Но, надеюсь, будет понятно
Одна из важнейших тем при работе с SO5 -- это использование исключений. Долго не удавалось выкроить время и подготовить более-менее подробный рассказ на эту тему. Сейчас удалось. Очередную часть серии Dive into SObjectizer-5.5, полностью посвященную исключениям, можно найти здесь (или на SlideShare).
Re: Эксперимент с конвейерами в духе реактивного программирования
В одном из обсуждений SO-5 подкинули идею о том, а нельзя ли декларативно описывать цепочки обработки сообщений таким образом, чтобы все необходимые агенты и связи между ними создавались автоматически. Да еще и с контролем со стороны компилятора за соответствием типов сообщений и их обработчиков.
Оказалось, что можно. Получается что-то вроде:
virtual void so_evt_start() override
{
// Создание конвейера.
// Возвращается mbox самой первой стадии созданного конвейера.
// Отсылая сообщения на этот mbox инициируется цепочка событий
// по обработке отосланного сообщения.auto pipeline = make_pipeline( *this,
src | stage(validation) | stage(conversion) | broadcast(
src | stage(archivation),
src | stage(distribution),
src | stage(range_checking) | stage(alarm_detector{}) | broadcast(
src | stage(alarm_initiator),
src | stage( []( const alarm_detected & v ) {
alarm_distribution( cerr, v );
} )
)
),
autoname );
send_delayed_to_agent< shutdown >( *this, chrono::seconds(1) );
// Использование конвейера.
// Посредством отложенных сообщений имитируется поступление
// данных от датчика температуры.for( uint8_t i = 0; i < static_cast< uint8_t >(250); i += 10 )
send_delayed< raw_value >(
so_environment(),
pipeline,
chrono::milliseconds( i ),
raw_measure{ 0, 0, i } );
}
Более подробное описание можно найти здесь. Собственно, сейчас самый большой вопрос такой: имеет смысл продолжать эти эксперименты? Или можно зафиксировать то, что получилось и пойти дальше.
Re: SObjectizer-5.5.5: обновился инструмент для работы с агентами в C++
Здравствуйте, so5team, Вы писали:
S>SObjectizer — это небольшой фреймворк для упрощения разработки многопоточных приложений на C++.
В обычных виндовых приложениях можно использовать? Я имею ввиду простые задачи когда главный тред с циклом обработки оконных сообщений запускает рабочий поток для выполнения некой длительной задачи и из рабочего потока в главный валятся сообщения о прогрессе, а главный может отправить рабочему потоку сообщение cancel?
Re[2]: SObjectizer-5.5.5: обновился инструмент для работы с агентами в C++
Здравствуйте, Kluev, Вы писали:
S>>SObjectizer — это небольшой фреймворк для упрощения разработки многопоточных приложений на C++.
K>В обычных виндовых приложениях можно использовать? Я имею ввиду простые задачи когда главный тред с циклом обработки оконных сообщений запускает рабочий поток для выполнения некой длительной задачи и из рабочего потока в главный валятся сообщения о прогрессе, а главный может отправить рабочему потоку сообщение cancel?
Частично. Из главного треда можно отсылать сообщения агентам, работающим внутри SObjectizer. Но вот обратно... Сейчас нет диспетчера, который бы позволял агенту работать на главной нити приложения, в которой уже крутится цикл обработки оконных сообщений.
Сделать такой диспетчер можно, но он будет заточен под конкретный фреймворк, который и обеспечивает цикл выборки сообщений: под Qt будет свой механизм, под MFC -- свой, под wxWidgets -- свой. Когда-то у нас был диспетчер под Qt, там для того, чтобы виджеты могли получать SObjectizer-овские сообщения, они наследовались сразу от двух классов -- от Qt-шного виджета и от SObjectizer-овского agent-а. Но потом этот диспетчер забросили за ненадобностью.
Re[3]: SObjectizer-5.5.5: обновился инструмент для работы с агентами в C++
Здравствуйте, so5team, Вы писали:
S>Здравствуйте, Kluev, Вы писали:
S>>>SObjectizer — это небольшой фреймворк для упрощения разработки многопоточных приложений на C++.
K>>В обычных виндовых приложениях можно использовать? Я имею ввиду простые задачи когда главный тред с циклом обработки оконных сообщений запускает рабочий поток для выполнения некой длительной задачи и из рабочего потока в главный валятся сообщения о прогрессе, а главный может отправить рабочему потоку сообщение cancel?
S>Частично. Из главного треда можно отсылать сообщения агентам, работающим внутри SObjectizer. Но вот обратно... Сейчас нет диспетчера, который бы позволял агенту работать на главной нити приложения, в которой уже крутится цикл обработки оконных сообщений.
В принципе обратно задача достаточно тривиальная.
Есть еще один вопрос относительно вот какой задачи. В программе есть список неких наборов данных по которому кликает пользователь. При клике на эл.списка рабочий поток получает сообщение и начинает загружать нужный набор данных. В процессе загрузки пользователь может сделать еще несколько кликов, при этом освободившийся рабочий поток должен начать загружать данные только для последнего выбранного эл.списка.
Т.е. агент должен иметь возможность либо просмотреть всю очередь сообщений перед обработкой, либо входящее сообщение замещает собой то которое уже есть в очереди.
Могут ли у агента быть несколько очередей сообщений с разными приоритетами?
Re[4]: SObjectizer-5.5.5: обновился инструмент для работы с агентами в C++
Здравствуйте, Kluev, Вы писали:
K>Т.е. агент должен иметь возможность либо просмотреть всю очередь сообщений перед обработкой, либо входящее сообщение замещает собой то которое уже есть в очереди.
K>Могут ли у агента быть несколько очередей сообщений с разными приоритетами?
Как раз поддержка нескольких потоков событий с разными приоритетами для одного агента -- это главная цель при разработке следующей версии SObjectizer, 5.6.0, релиз которой пока запланирован на конец августа.
Сейчас эту же задачу можно решать за счет использования пары агентов: collector+performer. Агент-collector является непосредственным получателем всех сообщений. Он организует приоритетные очереди, отслеживает дедлайны и т.д. Периодически к нему обращается агент-performer и запрашивает наиболее актуальное сообщение для конечной прикладной обработки. Более подробно этот подход описан здесь (и здесь еще немного).