Обработчик событий
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Добрый день. Подскажите пожайлуйста литературу или другие ресурсы о том как устроен механизм событий в программах. Я имею вввиду как его написать с нуля. Вот есть у меня "чистый лист бумаги" и какой либо язык программирования, как зделать так чтоб у меня был набор событий, какой либо класс мог генерировать это событие, а другие на него подписываться. Интересует именно сам принцип организации такого действа, как допустим организовано в мфц. Заранее спасибо. Незнал где тему создать, создал тут ибо желательно было бы видеть куски кода на с++, если таковые будут иметься.
For Those Who About The Rock We Salute You!!!
Принцип везде примерно один и тот же: описывается некая процедура, в которой происходит идентификация и обработка нужных событий. А когда создаётся какой-то системный объект, порождающий эти события, ему в качестве параметра передаётся указатель на эту процедуру. Сам факт вызова данной процедуры с определённым набором передаваемых ей параметров - это собственно и есть событие. Объектами, порождающими события, могут быть потоки (threads), графические окна в Windows, триггеры в СУБД, драйвера устройств или какие-то другие системные сервисы. А уже конечная реализация методов обработки тех или иных событий в каждой конкретной библиотеке С++ выполняется по-своему.
К примеру: всем известная функция main() - есть ни что иное как обработчик события запуска приложения.
К примеру: всем известная функция main() - есть ни что иное как обработчик события запуска приложения.
Поумнеть несложно, куда труднее от дури избавиться.
Хм.. хорошо допустим с генерацией событий я понял, а с подписокой? Допустим некий класс вызвал ту процедуру с определенными праметрами, тобишь сгенерил событие, а дальше, как допустим эта процедура сможет оповестить кучу других классов что произошло событие? З.Ы. Спасибо за помощь
For Those Who About The Rock We Salute You!!!
Ну а как это обычно делается в С++?
Все нужные тебе классы, которые зависят от данного события, наследуются от какого-то базового класса, у которого имеется соответствующий виртуальный метод. Пусть это будет базовый класс CEventSync с виртуальным методом Advise(). Все классы, которые наследуются от класса CEventSync должны будут переопределить виртуальный метод Advise(), т.е. реализовать в нём собственную процедуру обработки данного события.
Дальше тебе нужно будет создать динамический массив указателей на базовый класс CEventSync. Каждый класс, унаследованный от CEventSync, при создании экземпляря объекта (т.е. в конструкторе) должен добавлять указатель на самого себя (this) в этот динамический массив, а в деструкторе удалять собственный указатель из этого массива.
Сама процедура обработки событий циклом обходит весь этот массив указателей и для каждого объекта вызывает метод Advise(). Таким образом каждый объект получит уведомление о произошедшем событии.
Все нужные тебе классы, которые зависят от данного события, наследуются от какого-то базового класса, у которого имеется соответствующий виртуальный метод. Пусть это будет базовый класс CEventSync с виртуальным методом Advise(). Все классы, которые наследуются от класса CEventSync должны будут переопределить виртуальный метод Advise(), т.е. реализовать в нём собственную процедуру обработки данного события.
Дальше тебе нужно будет создать динамический массив указателей на базовый класс CEventSync. Каждый класс, унаследованный от CEventSync, при создании экземпляря объекта (т.е. в конструкторе) должен добавлять указатель на самого себя (this) в этот динамический массив, а в деструкторе удалять собственный указатель из этого массива.
Сама процедура обработки событий циклом обходит весь этот массив указателей и для каждого объекта вызывает метод Advise(). Таким образом каждый объект получит уведомление о произошедшем событии.
Поумнеть несложно, куда труднее от дури избавиться.
Спасибо огромное. Меня посещали подобные идеии, и тут они подтвердились. Теперь все понятно. Спасибо еще раз
For Those Who About The Rock We Salute You!!!