Информация об изменениях

Сообщение Re: v.5.5.15: агенты подружились с иерархическими конечными от 20.01.2016 7:07

Изменено 20.01.2016 7:07 so5team

SObjectizer -- это небольшой фреймворк для упрощения разработки многопоточных приложений на C++11 за счет использования идей из моделей акторов и publish-subscribe. SObjectizer является OpenSource-проектом и распространяется под трехпунктной BSD-лицензией.

Этот релиз добавляет возможность создания агентов в виде иерархических конечных автоматов. В версии 5.5.15 поддерживаются такие вещи, как композитные состояния, shallow- и deep-история, обработчики входа/выхода, лимиты времени, передача события на обработку в другое состояние (что-то вроде defer) и подавление событий.

Малюсенький примерчик для демонстрации новых возможностей: агент, который реализует мигающий LED-индикатор. Этот агент обрабатывает сигнал `turn_on_off` для включения и выключения режима мигания. Когда режим мигания включен, агент зажигает LED-индикатор на 1.5 секунды, затем тушит его на 0.75 секунды, затем опять зажигает и опять тушит и так до тех пор, пока не получит следующий сигнал `turn_on_off`. В виде диаграммы состояний этот конечный автомат может быть представлен следующим образом:


Код этого агента может выглядеть вот так:

class blinking_led final : public so_5::agent_t
{
    state_t off{ this },
        blinking{ this },
        blink_on{ initial_substate_of{ blinking } },
        blink_off{ substate_of{ blinking } };

public :
    struct turn_on_off : public so_5::signal_t {};

    blinking_led( context_t ctx ) : so_5::agent_t{ ctx }
    {
        this >>= off;

        off.just_switch_to< turn_on_off >( blinking );

        blinking.just_switch_to< turn_on_off >( off );

        blink_on
            .on_enter( []{ /* some device-specific code */ } )
            .on_exit( []{ /* some device-specific code */ } )
            .time_limit( std::chrono::milliseconds{1250}, blink_off );

        blink_off
            .time_limit( std::chrono::milliseconds{750}, blink_on );
    }
};


Более подробно поддержка иерархических конечных автоматов описана в Wiki проекта: so-5.5 In-depth &mdash; Agent States и в обновленной презентации Dive into SObjectizer-5.5. Second Part: Agent's States

Взять версию 5.5.15 можно либо из раздела Files на SouceForge, либо из Svn репозитория, либо из зеркала на GitHub.
Re: v.5.5.15: агенты подружились с иерархическими конечными
SObjectizer -- это небольшой фреймворк для упрощения разработки многопоточных приложений на C++11 за счет использования идей из моделей акторов и publish-subscribe. SObjectizer является OpenSource-проектом и распространяется под трехпунктной BSD-лицензией.

Этот релиз добавляет возможность создания агентов в виде иерархических конечных автоматов. В версии 5.5.15 поддерживаются такие вещи, как композитные состояния, shallow- и deep-история, обработчики входа/выхода, лимиты времени, передача события на обработку в другое состояние (что-то вроде defer) и подавление событий.

Малюсенький примерчик для демонстрации новых возможностей: агент, который реализует мигающий LED-индикатор. Этот агент обрабатывает сигнал `turn_on_off` для включения и выключения режима мигания. Когда режим мигания включен, агент зажигает LED-индикатор на 1.5 секунды, затем тушит его на 0.75 секунды, затем опять зажигает и опять тушит и так до тех пор, пока не получит следующий сигнал `turn_on_off`. В виде диаграммы состояний этот конечный автомат может быть представлен следующим образом:


Код этого агента может выглядеть вот так:

class blinking_led final : public so_5::agent_t
{
    state_t off{ this },
        blinking{ this },
        blink_on{ initial_substate_of{ blinking } },
        blink_off{ substate_of{ blinking } };

public :
    struct turn_on_off : public so_5::signal_t {};

    blinking_led( context_t ctx ) : so_5::agent_t{ ctx }
    {
        this >>= off;

        off.just_switch_to< turn_on_off >( blinking );

        blinking.just_switch_to< turn_on_off >( off );

        blink_on
            .on_enter( []{ /* some device-specific code */ } )
            .on_exit( []{ /* some device-specific code */ } )
            .time_limit( std::chrono::milliseconds{1500}, blink_off );

        blink_off
            .time_limit( std::chrono::milliseconds{750}, blink_on );
    }
};


Более подробно поддержка иерархических конечных автоматов описана в Wiki проекта: so-5.5 In-depth &mdash; Agent States и в обновленной презентации Dive into SObjectizer-5.5. Second Part: Agent's States

Взять версию 5.5.15 можно либо из раздела Files на SouceForge, либо из Svn репозитория, либо из зеркала на GitHub.