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

Здесь есть возможность читать онлайн «Александр Клюев - Обработка событий в С++» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Обработка событий в С++: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Обработка событий в С++»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Обработка событий в С++ — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Обработка событий в С++», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Александр Клюев

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

Введение

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

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

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

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

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

};

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

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

slotsomeHandler; // переходник

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();

};

Исходный код

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Обработка событий в С++»

Представляем Вашему вниманию похожие книги на «Обработка событий в С++» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Александр Долинин - Горизонт событий
Александр Долинин
Александр Клюев - Уроки из Будущего
Александр Клюев
Александр Клюев - Свобода от смерти
Александр Клюев
Александр Клюев - Хождение в вечность
Александр Клюев
Александр Бачило - Ждите событий (сборник)
Александр Бачило
Александр Бачило - Ждите событий
Александр Бачило
Александр Долинин - Горизонт событий [litres]
Александр Долинин
Александр Клюев - Сумма музыки
Александр Клюев
Отзывы о книге «Обработка событий в С++»

Обсуждение, отзывы о книге «Обработка событий в С++» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x