Что такое функция обратного вызова?
Проще говоря, функция обратного вызова – это функция, которая не вызывается программистом явно. Вместо этого существует некий механизм, который постоянно ожидает возникновения событий и вызывает выбранные функции в ответ на определенные события.
Этот механизм обычно используется, когда выполнение операции (функции) может занять много времени и вызывающая сторона функция не хочет ждать, пока операция завершится, но хочет получить информацию о результате операции. Как правило, функции обратного вызова помогают реализовать такой асинхронный механизм, в котором вызывающий абонент регистрируется, чтобы получить информацию о результате длительной обработки и продолжения других операций, а на более позднем этапе время, вызывающий получает информацию о результате.
Практический пример:
обработка событий Windows:
практически все программы Windows настраивают цикл событий, который заставляет программу реагировать на определенные события (например, нажатия кнопок , установив флажок, окно получает фокус), вызвав функцию. Удобно то, что программист может указать, какая функция вызывается, когда (скажем) нажимается определенная кнопка, даже если невозможно указать, когда кнопка будет нажата. Вызываемая функция называется обратным вызовом.
Иллюстрация исходного кода:
//warning: Mind compiled code, intended to illustrate the mechanism
#include <map>
typedef void (*Callback)();
std::map<int, Callback> callback_map;
void RegisterCallback(int event, Callback function)
{
callback_map[event] = function;
}
bool finished = false;
int GetNextEvent()
{
static int i = 0;
++i;
if (i == 5) finished = false;
}
void EventProcessor()
{
int event;
while (!finished)
{
event = GetNextEvent();
std::map<int, Callback>::const_iterator it = callback_map.find(event);
if (it != callback_map.end()) // if a callback is registered for event
{
Callback function = *it;
if (function)
{
(*function)();
}
else
{
std::cout << "No callback found\n";
}
}
}
}
void Cat()
{
std::cout << "Cat\n";
}
void Dog()
{
std::cout << "Dog\n";
}
void Bird()
{
std::cout << "Bird\n";
}
int main()
{
RegisterCallBack(1, Cat);
RegisterCallback(2, Dog);
RegisterCallback(3, Cat);
RegisterCallback(4, Bird);
RegisterCallback(5, Cat);
EventProcessor();
return 0;
}
Приведенное выше выведет следующее:
Cat
Dog
Cat
Bird
Cat
Надеюсь это поможет!
Примечание. Это из одного из моих предыдущих ответов, здесь
person
Alok Save
schedule
15.08.2011