SObjectizer-5.5.5: обновился инструмент для работы с агентами в C++
От: so5team https://stiffstream.com
Дата: 27.05.15 06:02
Оценка:
SObjectizer — это небольшой фреймворк для упрощения разработки многопоточных приложений на C++. SObjectizer позволяет создавать объекты-агенты, которые взаимодействуют друг с другом только посредством асинхронных сообщений. Сам SObjectizer берет на себя задачи диспетчеризации сообщений и предоставление агентам рабочего контекста для обработки получаемых сообщений.

Проект живет на SourceForge, распространяется под трехпунктной BSD-лицензией.

Версию 5.5.5 можно взять либо из секции Files на SF, либо из Svn-репозитория, либо из зеркала на GitHub.

Если говорить кратко, то в версии 5.5.5 появилось следующее:


Так же подготовлены две новые части серии презентаций “Dive into SObjectizer-5.5”, более подробно рассказывающие о состояниях агентов и кооперациях агентов (все имеющиеся презентации собраны здесь).

Если интересны подробности, то сюда.

Отдельная благодарность Алексею Сырникову, как за помощь в подготовке этого релиза, так и за поддержку зеркала SObjectizer на GitHub-е.
Re: SObjectizer-5.5.5: обновился инструмент для работы с агентами в C++
От: so5team https://stiffstream.com
Дата: 29.05.15 12:44
Оценка:
Поскольку довольно часто спрашивают об отличиях SO-5 от CAF, пришлось написать небольшой текст на эту тему. На Runlish-е, правда. Но, надеюсь, будет понятно
Re: Подробнее об использовании исключений
От: so5team https://stiffstream.com
Дата: 03.06.15 08:06
Оценка:
Одна из важнейших тем при работе с SO5 -- это использование исключений. Долго не удавалось выкроить время и подготовить более-менее подробный рассказ на эту тему. Сейчас удалось. Очередную часть серии Dive into SObjectizer-5.5, полностью посвященную исключениям, можно найти здесь (или на SlideShare).
Re: Эксперимент с конвейерами в духе реактивного программирования
От: so5team https://stiffstream.com
Дата: 08.06.15 11:17
Оценка:
В одном из обсуждений 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++
От: Kluev  
Дата: 03.07.15 12:11
Оценка:
Здравствуйте, so5team, Вы писали:

S>SObjectizer — это небольшой фреймворк для упрощения разработки многопоточных приложений на C++.


В обычных виндовых приложениях можно использовать? Я имею ввиду простые задачи когда главный тред с циклом обработки оконных сообщений запускает рабочий поток для выполнения некой длительной задачи и из рабочего потока в главный валятся сообщения о прогрессе, а главный может отправить рабочему потоку сообщение cancel?
Re[2]: SObjectizer-5.5.5: обновился инструмент для работы с агентами в C++
От: so5team https://stiffstream.com
Дата: 03.07.15 12:22
Оценка:
Здравствуйте, Kluev, Вы писали:

S>>SObjectizer — это небольшой фреймворк для упрощения разработки многопоточных приложений на C++.


K>В обычных виндовых приложениях можно использовать? Я имею ввиду простые задачи когда главный тред с циклом обработки оконных сообщений запускает рабочий поток для выполнения некой длительной задачи и из рабочего потока в главный валятся сообщения о прогрессе, а главный может отправить рабочему потоку сообщение cancel?


Частично. Из главного треда можно отсылать сообщения агентам, работающим внутри SObjectizer. Но вот обратно... Сейчас нет диспетчера, который бы позволял агенту работать на главной нити приложения, в которой уже крутится цикл обработки оконных сообщений.

Сделать такой диспетчер можно, но он будет заточен под конкретный фреймворк, который и обеспечивает цикл выборки сообщений: под Qt будет свой механизм, под MFC -- свой, под wxWidgets -- свой. Когда-то у нас был диспетчер под Qt, там для того, чтобы виджеты могли получать SObjectizer-овские сообщения, они наследовались сразу от двух классов -- от Qt-шного виджета и от SObjectizer-овского agent-а. Но потом этот диспетчер забросили за ненадобностью.
Re[3]: SObjectizer-5.5.5: обновился инструмент для работы с агентами в C++
От: Kluev  
Дата: 03.07.15 13:21
Оценка:
Здравствуйте, so5team, Вы писали:

S>Здравствуйте, Kluev, Вы писали:


S>>>SObjectizer — это небольшой фреймворк для упрощения разработки многопоточных приложений на C++.


K>>В обычных виндовых приложениях можно использовать? Я имею ввиду простые задачи когда главный тред с циклом обработки оконных сообщений запускает рабочий поток для выполнения некой длительной задачи и из рабочего потока в главный валятся сообщения о прогрессе, а главный может отправить рабочему потоку сообщение cancel?


S>Частично. Из главного треда можно отсылать сообщения агентам, работающим внутри SObjectizer. Но вот обратно... Сейчас нет диспетчера, который бы позволял агенту работать на главной нити приложения, в которой уже крутится цикл обработки оконных сообщений.


В принципе обратно задача достаточно тривиальная.

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

Могут ли у агента быть несколько очередей сообщений с разными приоритетами?
Re[4]: SObjectizer-5.5.5: обновился инструмент для работы с агентами в C++
От: so5team https://stiffstream.com
Дата: 03.07.15 13:38
Оценка:
Здравствуйте, Kluev, Вы писали:

K>Т.е. агент должен иметь возможность либо просмотреть всю очередь сообщений перед обработкой, либо входящее сообщение замещает собой то которое уже есть в очереди.


K>Могут ли у агента быть несколько очередей сообщений с разными приоритетами?


Как раз поддержка нескольких потоков событий с разными приоритетами для одного агента -- это главная цель при разработке следующей версии SObjectizer, 5.6.0, релиз которой пока запланирован на конец августа.

Сейчас эту же задачу можно решать за счет использования пары агентов: collector+performer. Агент-collector является непосредственным получателем всех сообщений. Он организует приоритетные очереди, отслеживает дедлайны и т.д. Периодически к нему обращается агент-performer и запрашивает наиболее актуальное сообщение для конечной прикладной обработки. Более подробно этот подход описан здесьздесь еще немного).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.