Библиотека CntmLib C++  :: События (пакет Cntm.Events)
Документация
  • Знакомство с CntmLib
  • Общие сведения
  • Установка и использование
  • Основные пакеты
  • Вспомогательные пакеты
  • Лицензия
  • Описание классов
  • НАЗНАЧЕНИЕ СОБЫТИЙ

    События - это механизм с помощью которого объект сервера оповещает объекты клиентов о наступлении какого либо события, связанного с сервером, например изменение состояния объекта сервера. Сервер ничего не знает о клиентах, он просто предоставляет точку подключения обработчиков. Подключением и отключением обработчиков управляют клиенты.

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

     

    КЛАССЫ СОБЫТИЙ

    Существуют два типа событий: прямые - Cntm::DirectEvent и отложенные - Cntm::DeferEvent. При использовании прямых событий запуск обработчиков происходит в момент генерации события. Но наибольший интерес представляют отложенные события, запуск обработчиков которых происходит не в момент генерации, а после завершения алгоритма, сгенерировавшего событие. Отложенные события являются мощным инструментом изоляции сервера от действий клиентов, которые они выполняют в своих обработчиках. Детальное описание отложенных и прямых событий приведено в Cntm::DeferEvent и Cntm::DirectEvent соответственно.

    Для подключения обработчика к событию используется специальный объект связи - Cntm::EventLink. При создании связи указывается событие и обработчик, и задача связи состоит в том, чтобы подключить обработчик к событию. При разрушении связи происходит автоматическое отключение обработчика от события. Иногда удобно группировать подключения обработчиков к событиям. Для этого используется Cntm::EventLinksGroup. Создается один единственный объект группы, содержащий несколько связей, при его уничтожении происходит автоматическое отключение всех обработчиков, входящих в группу.

    В событиях используется механизм подсчета ссылок, а в отложенных событиях - механизмы синхронизации.

     

    ПРИМЕР ИСПОЛЬЗОВАНИЯ

    Класс сервера

    class Server: public RefBase
    {
    public:
        typedef RefPtr<Server> Ptr;
    
        // Объявление объекта события. В качестве параметра шаблона события
        // указывается сигнатура метода обработчика (без указания класса).
        DeferEvent<void(int NewState, string Comment, Server::Ptr Serv)> ChangeEvent;
    	
        int State() const { return state; }
    	
        void SetState(int St)
        {
            // Генерация события. Для генерации используется оператор ()
            // объекта события. В качестве параметров указываются значения,
            // которые будут переданы обработчику.
            if (st != state) ChangeEvent(St, "This is defer event", *this);
    
            // Т.к. событие отложенное, то обработчики будут вызваны 
            // гарантированно после выхода из этого метода, поэтому
            // изменение состояния можно производить после генерации.
            state = St;
        } 
    	
    private:
        int state;
    };

    Класс клиента

    class Client: public RefBase
    {
    public:
        Client(Server::Ptr Serv)
        {
            // Инициализируем связь между событием сервера и обработчиком
            // клиента. После этого клиент будет обрабатывать события от
            // сервера.
             onChangeServerState.Attach(Serv->ChangeEvent,
                this, &Client::OnChangeServerState);
        }
    	
    private:
        // Объект связи события и обработчика. Т.к. этот объект будет
        // уничтожен вместе с клиентом, то нет нужды разрушать связь вручную.
        EventLink onChangeServerState;
    
        // Обработчик события от сервера.
        void OnChangeServerState(int NewState, string Comment, Server::Ptr Serv)
        {
            cout << "NewState=" << NewState << endl;
        }
    };

     

    СМ.

  • Классы событий Cntm::DeferEvent, Cntm::DirectEvent
  • Классы связей событий и обработчиков Cntm::EventLink, Cntm::EventLinksGroup
  • Тестовый пример EventsExp.cpp

  • Главная :: Документация :: Описание классов :: Download 

    © 2005, Овсеевич Р.В.
    SourceForge.net Logo