Документация
Знакомство с 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
|