Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
WebProgrammer1
16 / 16 / 5
Регистрация: 24.01.2014
Сообщений: 187
#1

События и их обработка - C++

11.11.2014, 15:45. Просмотров 716. Ответов 3
Метки нет (Все метки)

Подскажите как можно реализовать обработку событий, чтобы можно было использовать примерно такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void test_handler(object* thisobject) {
    // Событие обработано!!!
}
 
void test_handler(other* thisobject) {
    // Событие обработано!!!
}
 
void test_handler2(object* thisobject) {
    // Событие обработано ещё раз!!!
}
 
int main() {
    Object* object = new object;
    object->addHandler(EVENT_TEST, test_handler); // Зарегистрировать обработчик
    object->addHandler(EVENT_TEST, test_handler2); // Зарегистрировать обработчик
 
    object->event(EVENT_TEST); // Вызвать события
 
    OtherObject* other = new other;
    other ->addHandler(EVENT_TEST, test_handler); // Зарегистрировать обработчик
    other ->event(EVENT_TEST); // Вызвать события
 
    return 1;
}
я делал так: в классе объявлял указатель на функцию для обработки события (например void (*onTestEvent)(object*), а потом, когда событие наступало, вызывал её.
При таком подходе при появлении нового события нужно прописывать в классе указатель на обработчик, а ещё невозможно зарегистрировать несколько обработчиков на одно событие

Я уже долгое время занимаюсь Web-программированием, пишу на PHP, а C++ только недавно начал изучать, всё непривычно

Добавлено через 19 часов 8 минут
почти реализовал!
только сейчас при переборе и выполнении всех обработчиков происходит ошибка.
Для хранения обработчиков я использовал класс стека отсюда http://cppstudio.com/post/5155/

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void Event::addHandler(int action, void (*handler)()) {
    if (actions[action] == NULL) {
        actions[action] = new EventAction;
    }
 
    actions[action]->handlers.push(handler); // Запись указателя в стек
}
 
void Event::call(int action) {
    if (actions[action] == NULL) return;
    int i;
    void (*hnd)();
 
    for (i=0;i<5;i++) {
        hnd = actions[action]->handlers.Peek(i);
        if (hnd != NULL) hnd(); // Вот в этом месте ошибка - программа просто завершается.
// В hnd попадает адрес указателя на обработчик, может из-за этого и ошибка?
    }
}
В hnd попадает адрес указателя на обработчик, может из-за этого и ошибка?

Добавлено через 23 часа 28 минут
убрал стек, сделал через массив указателей, теперь работает!
Можно для любых классов регистрировать обработчики и вызывать события
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.11.2014, 15:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос События и их обработка (C++):

обработка события - C++ Builder
:)Здравствуйте! Подскажите пожалуйста как можно описать обработчик события вне класса. Имеется класс, который выводит на форму некоторое...

Обработка события - C++ Builder
Подскажите пожалуйста. Как правильно написать обработку события при нажатии кнопки. Нажимаем кнопку должна выходить справка о программе....

Обработка события старт программы - C++ Builder
Как добиться, чтобы определенный код выполнялся при запуске программы

Обработка нестандартного события - Visual C++
Средствами MFC мне требуется сделать так, чтобы при выделении объекта в MDI-приложении в Status bar появлялась соответствующая запись. Где...

Обработка события ввода в edit - C++ WinAPI
Как сделать обработку события ввода в едит? То есть когда я вожу текст в едит, при каждом нажатии вызывается какая-то функция. Было бы...

Обработка события выбора в ComboBox - C++ WinAPI
Вот есть ComboBox в диалоговом окне, как обработать событие выбора элемента? То есть щелкнул, событие вот где то тут пошло: INT_PTR...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Avazart
Эксперт С++
7152 / 5329 / 278
Регистрация: 10.12.2010
Сообщений: 23,580
Записей в блоге: 17
12.11.2014, 21:30 #2
Запрещение переинициализации public-поля как члена класса
Реализация события без использования VCL

Добавлено через 7 минут
А вообще наверное, если есть возможность лучше использовать boost::function / std::function
Nick Alte
Эксперт С++
1636 / 1008 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
13.11.2014, 18:29 #3
А ещё лучше - сразу boost::signals2, оно как раз для этих целей предназначено.
Avazart
Эксперт С++
7152 / 5329 / 278
Регистрация: 10.12.2010
Сообщений: 23,580
Записей в блоге: 17
13.11.2014, 19:05 #4
Или фрейморк типа Qt и накрайняк VCL
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2014, 19:05
Привет! Вот еще темы с ответами:

Обработка события внешней программы - C++
Привет всем, Пытаюсь написать плагин на C++ для приложения KD. Данное приложение взаимодействует с библиотекой написанной на VB6, или...

функция SetTimer и обработка события таймера - C++
Пишу программу в winapi. В какую часть программы я должен вставить функцию SetTimer?

Обработка события нажатия клавиши мыши в консоли - C++
Здравствуйте господа програмисты!!!Может кто нибудь написать элементарный исходник в консольном приложении когда нажимается левая кнопка он...

Обработка события Click, вставка html после генерации и обработка этого кода - jQuery
Подскажите пожалуйста как заставить работать эту часть кода 18 строка $(&quot;.image&quot;).click(function() { alert (1); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
13.11.2014, 19:05
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru