2012-04-25 2 views
2

Привет, мне очень любопытно узнать, что такое использование функций обратного вызова. Можете ли вы любезно объяснить это простым примером, пожалуйста.Что такое функция обратного вызова в C++?

В моем проекте я наблюдаю, что определенная функция CallBack неожиданно вызывается некоторой функцией, которая указана в стеке вызовов User.dll! 546383c().

Я действительно смущен тем, кто вызывает этот обратный вызов, и когда это произойдет.

Строка вызова выглядит хорошо до точки (например, функция A() вызывает вызов B() C() и т. Д.), И вдруг что-то происходит, а некоторые функции в User.dll набирают этот вызов. Я потерял следы функций.

Можете ли вы любезно объяснить пример. Заранее спасибо.

+1

«User.dll! 546383c()» - вы должны получить символы отладки для вашей системы.Получите окно модулей, затем щелкните правой кнопкой мыши на User32 и «загрузите символы»; вам может потребоваться настроить Microsoft Symbol Server, но затем загрузить их. Затем он покажет вам имена функций внутри User32, которые должны сделать это более очевидным. – Rup

ответ

2

Привет, мне очень любопытно узнать, что такое использование функций обратного вызова. Можете ли вы любезно объяснить это простым примером, пожалуйста.

Нельзя сказать об этом. Обратные вызовы - это механизм для некоторой библиотеки или системного кода, позволяющий коду клиента/приложения обрабатывать событие. Например, вы можете иметь обратный вызов, связанный с:

  • истечении некоторого таймера/сигнализации
  • событие ввода/вывода, например, завершение чтения или записи из файлов, сети, клавиатуры/консоли и т.д., или даже изменение возможности чтения или записи программы (на основе ограничений размера буфера) или новых/потерянных соединений
  • завершение некоторой асинхронной обработки (например, другой поток, выполняющий некоторые вычисления)
  • непредвиденная ошибка в некоторая асинхронная обработка
  • возможность управлять некоторыми процессами пока он находится в определенном состоянии (например, принять решение о том, принимать ли конкретного клиента, после чего вызывающий абонент либо отключит, либо начнет обработку асинхронного клиента)

Почему user.dll вызывает обратный вызов - кто знает? Вы ничего нам не рассказали о своей программе или о том, что она делает.

На логическом уровне обратный вызов на самом деле не может быть отправлен в поток, пока ваш поток не проверит (возможно, даже блоки, чтобы ждать) выделенные сообщения, или обратный вызов может прерывать все, что делает ваш поток, для выполнения отдельной обработки. Первый часто встречается, когда события создаются другими частями вашей программы на C++, последние являются общими для операционных систем и аппаратных обратных вызовов (например, «сигнал» в Linux/UNIX).

1

Просто обратные вызовы похожи на указатели функций, используемые для настройки одной функции для отправки назад (обратного вызова) другой функции в приложении. Пример. При таком подходе можно обрабатывать такие события, как щелчок мышью, перемещение мыши, выбор меню и общая двунаправленная связь между двумя объектами в памяти.

Таким образом, тот, кто вызывает обратный вызов, может быть пользователем или любыми другими событиями связи, поднятыми.

Смежные вопросы