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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ CreateProcess вылетание программы http://www.cyberforum.ru/cpp/thread1290135.html
Открываю мною скомпилированную программу на FreePascal при помощи CreateProcess(visual c++) Вылетает с ошибкой Runtime Error 2 at adress $здесь_адрес , хотя процесс открывается корректно. При открытии через проводник программа запускается без ошибок, выполняет нужный код и выключается. ZeroMemory(&S_I, sizeof(S_I)); S_I.cb = sizeof(S_I); ZeroMemory(&P_I, sizeof(P_I)); S_I.dwFlags =...
C++ Подскажите справочные материалы по регулярным выражениям std::regex Помогите разобраться с синтаксисом регулярных выражений для std::regex. Работаю в VS 2012. Нашел некий список на сайте Microsoft, но что-то не получается применить выражения из него: http://msdn.microsoft.com/ru-ru/library/az24scfc.aspx Этот пример выдаёт 3 пустые строки: using namespace std; #include "stdafx.h" #include <regex> #include <iostream> http://www.cyberforum.ru/cpp/thread1289089.html
C++ Программа для перезапуска компьютера С++
Всем форумчанам привет :) Требуется помощь по написанию программы на форме с++ через MS Visual Studio 2010 Задание такое: написать программу которая при нажатие на кнопку перезапустит компьютер в ОС Линукс. Что и как делать я вообще не могу понять. Буду очень благодарен вашей помощи :)
червь для обучательных целей C++
http://www.cyberforum.ru/cpp-networks/thread358362.html Подскажите пожайлуста,как написать простейший червячок.Я пытался найти протоколы интернета и как то соеденить их в коде самостоятельно,но не понял,как они работают вместе.Нигде об этом ничего.Также я выяснил,что уже написан червь,что с помощью бот компьютеров успешно прошел весь интернет и составил глобальную карту ip адресов.Где можно...
C++ Для работы в игровых компаниях нужно пройти тест около 50 заданий по этому языку. Скиньте подобный тест http://www.cyberforum.ru/cpp/thread1286510.html
C++ Какие разделы математики нужно знать, чтобы стать разработчиком игр? знаю чтобы стать геймдевелопером нужно знать математику.хз и как это знать?как ее применять?можно примеры? подробнее

Показать сообщение отдельно
WebProgrammer1
16 / 16 / 5
Регистрация: 24.01.2014
Сообщений: 187
11.11.2014, 15:45     События и их обработка
Подскажите как можно реализовать обработку событий, чтобы можно было использовать примерно такой код:
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 минут
убрал стек, сделал через массив указателей, теперь работает!
Можно для любых классов регистрировать обработчики и вызывать события
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 04:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru