Обработка событий в С++

Обработка событий в С++

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

Жанр: Программирование
Серии: -
Всего страниц: 2
ISBN: -
Год издания: Не установлен
Формат: Полный

Обработка событий в С++ читать онлайн бесплатно

Шрифт
Интервал

Введение

Так уж исторически сложилось, что в языке С++ нет событий. Событием (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; // переходник

> void onEvent(const char *eventName) { // обработчик события

>  printf("\t%s event handled in %s object\n", eventName, color);

> }

> EventHandler(const char *clr): color(clr) {

>  handler.init(g_Raiser.event, onEvent, this); // установим связь

> }

>};


>int main(int argc, _TCHAR* argv[]) {

> EventHandler red("Red");

> g_Raiser.raise("Small"); // событие обработается в red

> {

>  {

>   EventHandler blue("Blue");

>   g_Raiser.raise("Big"); // событие обработается в red и blue

>  }

>  EventHandler green("Green");

>  g_Raiser.raise("Medium"); // событие обработается в red и green.

>  // объект blue уничтожен, связь разорвана

> }

> return 0;

>}

Краткое описание классов

signal – cобытие (детали реализации опущены)

>template // Arg – тип аргумента функции обработчика

>class signal {

>public:

> // Инициировать событие

> void raise(

>  Arg arg // Арумент arg будет передан в обработчики события

> );

>};

slot – переходник для обработки события в классе-обработчике (детали реализации опущены)

>class slot {

>public:

> // установить связь с событием и обработчиком

> template <

>  class Owner, // класс-обработчик

>  class Arg // Тип аргумента события.

> >

> void init(

>  signal&sig, // событие

>  void (Owner::*mpfn)(Arg), // функция обработчик

>  Owner *This // обьект обработчик

> );

> // установить связь с событием и обработчиком для случая signal

> template <

>  class Owner // класс-обработчик

> >

> void init(

>  signal&sig, // событие

>  void (Owner::*mpfn)(), // функция обработчик

>  Owner *This // обьект обработчик

> );

> // разорвать связь

> void clear();

>};

Исходный код

Весь код находится в файле sigslot.h

>#ifndef _SIGSLOT_h_

>#define _SIGSLOT_h_

>// sigslot.h – autor Kluev Alexander [email protected]


>template >class signal;


>class slot {

> friend class signal_base;

> slot *_prev;

> slot *_next;

> struct Thunk {};

> typedef void (Thunk::*Func)();

> Thunk *_trg;

> Func _mfn;

>public:

> slot(): _trg(0), _mfn(0), _prev(0), _next(0) {}

> ~slot() {clear();}

>public:

> void clear() {

>  if (_next) _next->_prev = _prev;

>  if (_prev) _prev->_next = _next;

>  _prev = _next = 0;

> }

> template

> void init(signal&sig, void (Owner::*mpfn)(Arg), Owner *This) {

>  clear();

>  _trg = (Thunk*)This;

>  _mfn = (Func)mpfn;

>   sig._add(*this);

> }

> template

> void init(signal&sig, void (Owner::*mpfn)(), Owner *This) {

>  clear();

>  _trg = (Thunk*)This;

>  _mfn = (Func)mpfn; sig._add(*this);

> }

>private:

> template

> void _call(Arg a) {

>  typedef void (Thunk::*XFunc)(Arg);

>  XFunc f = (XFunc)_mfn;

>  (_trg->*f)(a);

> }

> void _call() {

>  (_trg->*_mfn)();

> }

>};


>class signal_base {

>protected:

> friend class slot;

> slot _head;

> void _add(slot&s) {


Рекомендуем почитать
Никита и Микитка

lenok555: Примечания и обложка добавлены из книги издания 1951 года.


Великий путь из варяг в греки. Тысячелетняя загадка истории

Согласно всем учебникам, Русь складывалась вокруг великого торгового пути из варяг в греки, соединявшего Балтийское море с Чёрным. Через Неву — Ладожское озеро — Волхов — Ильмень — Ловать — Днепр шли с севера на юг за византийским золотом и товарами норманны-варяги, подчинявшие славян…Повесть временных лет хранит единственное свидетельство об этом знаменитом пути. Но существовал ли он в действительности? Журналист и историк Ю. Звягин на основе современных археологических данных, изучения местности по всему предполагаемому пути, а также результатам экспедиции «Хольмгард» (1994, 1996) доказывает, что путь из варяг в греки через всю Русь — миф.


Казусы частного сыска

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


Одна из нас лишняя

С некоторых пор семье преуспевающих архитекторов Овчаренко начали угрожать. И когда однажды хриплый бас пригрозил, что прежде всего не поздоровится их сыну, предприниматели наняли для Никиты телохранителя Евгению Охотникову. Когда Юрий Овчаренко не вернулся из командировки в Софию, Жене пришлось совместить обязанности бодигарда с работой частного сыщика. Ведь вместе с ним исчезли и четыреста тысяч долларов.


Изучаем Java EE 7

Java Enterprise Edition (Java EE) остается одной из ведущих технологий и платформ на основе Java. Данная книга представляет собой логичное пошаговое руководство, в котором подробно описаны многие спецификации и эталонные реализации Java EE 7. Работа с ними продемонстрирована на практических примерах. В этом фундаментальном издании также используется новейшая версия инструмента GlassFish, предназначенного для развертывания и администрирования примеров кода. Книга написана ведущим специалистом по обработке запросов на спецификацию Java EE, членом наблюдательного совета организации Java Community Process (JCP)


Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


Фундаментальные алгоритмы и структуры данных в Delphi

Книга "Фундаментальные алгоритмы и структуры данных в Delphi" представляет собой уникальное учебное и справочное пособие по наиболее распространенным алгоритмам манипулирования данными, которые зарекомендовали себя как надежные и проверенные многими поколениями программистов. По данным журнала "Delphi Informant" за 2002 год, эта книга была признана сообществом разработчиков прикладных приложений на Delphi как «самая лучшая книга по практическому применению всех версий Delphi».В книге подробно рассматриваются базовые понятия алгоритмов и основополагающие структуры данных, алгоритмы сортировки, поиска, хеширования, синтаксического разбора, сжатия данных, а также многие другие темы, тесно связанные с прикладным программированием.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.


Как пасти котов. Наставление для программистов, руководящих другими программистами

«Как пасти котов» – это книга о лидерстве и руководстве, о том, как первое совмещать со вторым. Это, если хотите, словарь трудных случаев управления IT-проектами. Программист подобен кошке, которая гуляет сама по себе. Так уж исторически сложилось. Именно поэтому так непросто быть руководителем команды разработчиков. Даже если вы еще месяц назад были блестящим и дисциплинированным программистом и вдруг оказались в роли менеджера, вряд ли вы знаете, с чего надо начать, какой выбрать стиль руководства, как нанимать и увольнять сотрудников, проводить совещания, добиваться своевременного выполнения задач.