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

C++

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

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

11.11.2014, 15:45. Просмотров 638. Ответов 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++ Builder обработка события
C++ dll и события
Обработка события нажатия клавиши мыши в консоли C++
События в COM Visual C++
C++ Builder Обработка события
Visual C++ Обработка нестандартного события
C++ Builder Обработка события старт программы
C++ WinAPI Потоки, события
C++ функция SetTimer и обработка события таймера
C++ WinAPI Обработка события ввода в edit
C++ Обработка события внешней программы
Обработка события выбора в ComboBox C++ WinAPI

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
7063 / 5240 / 262
Регистрация: 10.12.2010
Сообщений: 23,058
Записей в блоге: 17
12.11.2014, 21:30     События и их обработка #2
Запрещение переинициализации public-поля как члена класса
Реализация события без использования VCL

Добавлено через 7 минут
А вообще наверное, если есть возможность лучше использовать boost::function / std::function
Nick Alte
Эксперт С++
1605 / 997 / 118
Регистрация: 27.09.2009
Сообщений: 1,923
Завершенные тесты: 1
13.11.2014, 18:29     События и их обработка #3
А ещё лучше - сразу boost::signals2, оно как раз для этих целей предназначено.
Avazart
7063 / 5240 / 262
Регистрация: 10.12.2010
Сообщений: 23,058
Записей в блоге: 17
13.11.2014, 19:05     События и их обработка #4
Или фрейморк типа Qt и накрайняк VCL
Yandex
Объявления
13.11.2014, 19:05     События и их обработка
Ответ Создать тему
Опции темы

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