|
|
||||||
Callback. Так ли используется на практике?24.07.2017, 20:56. Показов 1339. Ответов 9
Метки нет (Все метки)
Доброго времени суток.
Сам по большему счету я работаю с Delphi, но тут сложилась надобность в С/С++ состряпать механизм "событий", как это привычно называется в Delphi или функций обратного вызова. Чутку покумекав, пришел к такому выводу, что сие можно организовать через указатель на функцию в С/С++ и в общем-то состряпал, все работает как и ожидалось. Вот код ниже должен это демонстрировать, пример на абум, отсюда и вопрос, корректно ли так использовать данный механизм? Или что-то однажды окажется "подводным камнем"?
0
|
||||||
| 24.07.2017, 20:56 | |
|
Ответы с готовыми решениями:
9
Для чего на практике используется XML в Web-программировании? Где используется AES шифрование на практике, в каких информационных системах
|
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
| 27.07.2017, 21:41 | |
|
Я что-то в твоем коде не вижу событий. Ты же хочешь систему событий, я так понимаю? И хендлеры подписанные на то или иное событие.
У тебя вижу в коде только передачу функции по указателю в класс, и делегированный вызов этой функции...
1
|
|
|
|
||||||
| 29.07.2017, 19:37 [ТС] | ||||||
|
Да это был первый тест, чтобы вызвать функцию "неявно" и то, я не знаю так ли это правильно делается, но по примеру выше, я получил нужный мне результат. Мне нужно, чтобы при определенных обстоятельствах, вызывалась некая функция, первым, что пришло в голову, вызвать по указателю некую функцию внутри какого-то класса, в котором происходят какие-то вещи, а в функции "снаружи" уже забираю нужный мне результат. Пример конечно же не ахти, но получил же обратную реакцию функции. На реальном примере, все конечно же будет запакованно в классы и явный такой вот вызов, как из примера
Простите уж за такие некорректные формулировки, я самоучный программер на интуитивном уровне, да и в первую очередь не сиплюсплюшний ![]() а по ответам и их сожержанию, могу судить, что нет претензий к тому, что спрашиваю и сделал все как-то так, ну или вообще все не так, что уж лучше об этом не говорить? ![]() ладно.. попробую так пока что)
0
|
||||||
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
||||||
| 30.07.2017, 08:16 | ||||||
|
Arcor, Вот простейшая сырая система событий:
Как поймешь, начни разбираться: 1. как сделать события не std::string, тоесть чтобы они хранились не в строках. У меня к примеру в реализации системы событий за счет определенного макроса генерируется макрос, который автоматом задает имя структуры и тип хендлера, который можно подписать на это событие 2. В моем приведенном коде, хендлер не имел параметров вовсе. Это не есть хорошо. Нужно сделать, чтобы ты создавал события, которые могли подписывать на себя разные прототипы хендлеров - событие 1: void(*)(int); событие 2: void(*)(); событие 3: void(*)(int, std :: string, float) и тд. Но вызов того или иного события все равно происходил через метод invoke(...) класса EventSystem. Чтобы такого достичь, читай про "Шаблоны с переменным числом параметров" или variadic templates
1
|
||||||
|
|
|
| 31.07.2017, 00:05 [ТС] | |
|
Ну и? Смысл сводится к тому, это то же самое, что и я и написал выше, только я более скудный пример описал, может я не вижу главного различия, но работает по той же системе.
Смысл все таки сводится к тому, что вызывается функция по указателю и больше ничего иного там не производится. Все ясно. Всем спасибо ![]() Пункт 2 в тексте не ясен, для чего мне "подписывать" одним методом все различные события? Понятное дело, что со списком (вектором) через цикл можно пробегаться и исктаь там что надо и уже ветвить трали-вали, НО, не более ли логичнее сказать - я хочу использовать событие "А", описать его как надо для "А" и установить все необходимое для "А" и будет явное "А". Надо второе событие "Б", описать под "Б" все, но с другим списком аргументов. И потом просто коннектить/дисконнектить те события, которые я хочу использовать вообще. И не понятно для чего вообще делать чтобы от одного условия выполнялись несколько событий, ну ОК, пусть, но осуществится то просто точно так же))) НО, спорить с профессионалами конечно же не стану ... ![]() Не по теме: но жаргончик бы... "кури пока это" как-то странно воспринимается.. да и "ты", как-то не очень чужих и незнакомых людей ТЫкать :scratch:
0
|
|
|
|
|
| 31.07.2017, 01:35 | |
|
1
|
|
|
Ушел с форума
|
|||||||
| 31.07.2017, 10:18 | |||||||
|
1. У callback-функции и ее прототипа четко определить соглашение о вызовах - stdcall, cdecl, fastcall и т.д. Это поможет в будущем избежать различных ошибок при внесении изменений в программу. 2. Дать возможность клиенту передавать в callback какие-то свои данные. Обычно это делается через дополнительный параметр размером sizeof (void *). Пример:
2
|
|||||||
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|||||
| 01.08.2017, 08:14 | |||||
|
Arcor,
![]() RunningMan, Также как и паттерн система сообщений и паттерн система событий, тоже очень похожи, но тоже имеют разницу. Если нужно, я найду линки, где можно почитать об этом подробнее Убежденный, eventSystem -> invoke<SOME_EVENT>( параметры для SOME_EVENT )параметры метода invoke изменялись в зависимости от переданного шаблонного параметра.
1
|
|||||
|
|
|
| 01.08.2017, 11:05 [ТС] | |
|
Я все понимаю, ребят, у меня опыта просто нету
Когда-то он появится возможно и появятся уже совсем другие слова и значения в обиходе и конечно же опыт))) Но с чего-то начать надо было ![]() Благодарю всех за содействие!
0
|
|
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
||
| 01.08.2017, 13:06 | ||
|
Arcor,
Я учусь сам, и очень часто задаю тупые вопросы
0
|
||
| 01.08.2017, 13:06 | |
|
Помогаю со студенческими работами здесь
10
Невозможно получить доступ к файлу так как он используется другим процессом Не удалось получить доступ к файлу так как он используется другим процессом Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. .
Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
|
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла:
Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
|
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-text-sdl3-c. zip
finish-text-sdl3-cpp. zip
|
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
|
|
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo
Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло.
Но на выплатах по больничным это. . .
|
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в КА2. Данные берутся из регистра сведений, по которому настроено. . .
|
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y
Z4Tv2zpXVVo
https:/ / github. com/ shumilovas/ med2. git
|
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа в КА2.
В качестве фильтра для отбора справочника служит группа номенклатуры.
Отбор по наименованию. . .
|