Обработка событий в С++ - Александр Клюев

Бесплатно читаем книгу Обработка событий в С++ - Александр Клюев без сокращений! Чтобы читать полную версию, не нужна регистрация на сайте. Помните, что чтение доступно как на компьютере, так и на Андроиде, Айфоне и любом другом телефоне.
Обработка событий в С++ - Александр Клюев

Александр Клюев - Обработка событий в С++ о чем книга


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

Читать онлайн бесплатно Обработка событий в С++, автор Александр Клюев


Введение

Так уж исторически сложилось, что в языке С++ нет событий. Событием (event) является исходящий вызов (программисты на VB хорошо знакомы с ними) и в С++ их действительно нет. Иногда события путают с сообщениями (message), но это не верно. Сообщение это прямой вызов: например windows вызывает оконную процедуру для передачи собщения окну. Объект (система) вызывает функцию обькта(окна). Вызов происходит от объекта к объекту. В отличии от сообщения событие имеет другую механику. Объект инициирует событие и вызываются все объекты-обработчики. Т.е. от одного объекта к нескольким. Причем объект инициатор события может ничего не «знать» об его обработчиках, поэтому событие называют исходящим вызовом.

Раз уж в С++ события на уровне языка не поддерживаются, значит стоит организовать их на уровне библиотеки. Здесь приведена реализация такой библиотеки. В ней есть два класса signal и slot.

Итак, чтобы сделать какой нибудь класс источником события поместите в него переменную типа signal:

>struct EventRaiser { // источник события

signal someEvent; // void – тип аргумента события

>};

А чтобы сделать класс обработчиком поместите в него переменную типа slot, функцию обработчик и свяжите slot с обработчиком:

>struct EventHandler { // обработчик события

slot someHandler; // переходник

> void onEvent(void) {

>  // функция обработчик события

>  printf("event handled");

> }

> void connect (EventRaiser& er) {

>  someHandler.init(er.someEvent, onEvent, this); // установим связь события с обработчиком

> }

>};


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

>struct EventRaiser { // источник события

signal someEvent; // void – тип аргумента события

> void someFunc() {

>  someEvent.raise(); // инициация события

> }

>};

Пример

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

>#include "stdafx.h"

>#include "sigslot.h"


>struct EventRaiser { >// источник события

> signal event; // const char* – тип аргумента. может быть void

> void raise(const char *eventName) {

>  printf("raising %s event\n", eventName);

>  event.raise(eventName);

> }

>} g_Raiser; // глобальный объект


>struct EventHandler { // обработчик события

> const char *color;

> slot handler; // переходник

Вы автор?
Жалоба
Все материалы размещаются на сайте его пользователями.
Если Ваша книга была опубликована без Вашего ведома и/или без Вашего согласия, пожалуйста, напишите нам, и мы в срочном порядке примем меры.