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

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

Авторы:

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

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

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

Всего в книге 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 так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.


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

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


MFC и OpenGL

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


DirectX 8. Начинаем работу с DirectX Graphics

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


Java 7

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


Pro Git

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


Нисхождение

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


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

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


Полигон

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


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

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