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

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

Авторы:

Жанр: Программирование

Циклы: не входит в цикл

Формат: Полный

Всего в книге 2 страницы. У нас нет данных о годе издания книги.

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

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


Введение

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


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

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


Симуляция частичной специализации
Автор: П Кузнецов

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



Pro Git

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


Программирование приложений для мобильных устройств под управлением Android. Часть 1

Книга посвящена разработке программ для мобильных устройств под управлением операционной системы Android. Рассматривается создание приложений с использованием системных компонентов и служб Android. Приведены базовые данные о структуре приложений, об основных классах и их методах, сопровождаемые примерами кода. Часть 1 содержит шесть глав, описывающих основные принципы создания приложений, пользовательский интерфейс, полномочия приложений, а так же базовые классы: Activity, Intent, Fragment. Книга предназначена для программистов, владеющих языком программирования Java и желающих освоить написание приложений, работающих под ОС Android.


Геймдизайн. Рецепты успеха лучших компьютерных игр от Super Mario и Doom до Assassin’s Creed и дальше

Что такое ГЕЙМДИЗАЙН? Это не код, графика или звук. Это не создание персонажей или раскрашивание игрового поля. Геймдизайн – это симулятор мечты, набор правил, благодаря которым игра оживает. Как создать игру, которую полюбят, от которой не смогут оторваться? Знаменитый геймдизайнер Тайнан Сильвестр на примере кейсов из самых популярных игр рассказывает как объединить эмоции и впечатления, игровую механику и мотивацию игроков. Познакомитесь с принципами дизайна, которыми пользуются ведущие студии мира! Создайте игровую механику, вызывающую эмоции и обеспечивающую разнообразие.


Нисхождение

Отдаленное будущее. Человечество вышло в космос и колонизирует новые планеты, но его образ жизни и проблемы, с ним связанные, не изменились. Миром правят гигантские могущественные корпорации, борющиеся за ресурсы и сферы влияния. Группа случайных людей становится наемниками, цель их миссии – сместить зарвавшегося провинциального диктатора в интересах корпорации-нанимателя. Но ступившие на тернистый путь «солдата удачи» не догадываются, какая роль им предназначена и чего им будет стоить эта операция...ПримечаниеДанное произведение является художественным вымыслом, поэтому любые совпадения и пересечения с известной читателям реальностью случайны, а субъективизм, несуразности и нестыковки, наоборот, закономерны.


Смерть в кредит

Скандальный и шокирующий роман Луи-Фердинанда Селини — одно из классических произведений французской литературы XX века. Написанный в 1936 году, он широко представил колоритную картину жизни и нравов парижского дна. Посвященный юности писателя, роман «Смерть в кредит» оказал огромное влияние на молодежные движения второй половины XX века.


Полигон

Нас ненавидят. Нас всех хотят уничтожить. И потому не обойтись без сталкера Макса Края. Только он способен пройти через ловушки Полигона и дать отпор отщепенцам всех мастей: маньякам и мутантам, наемным убийцам и криминальным авторитетам. Только ему под силу спасти человечество от оружия массового поражения! Но как не отступить и не сдаться, когда враги коварны, а преград на пути так много…


Эффект плато. Как преодолеть застой и двигаться дальше

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


Поделиться мнением о книге