Вообще говоря, не вдаваясь в особенности реализации Unix или Windows, обратные вызовы вызываются из основного цикла событий, который выглядит примерно так:
Loop forever {
Get a message from the event queue.
Process the message
}
Этап «Получить сообщение» будет иметь очень маленький сон, если он ожидает появления сообщения в очереди, вероятно, менее миллисекунды. Очередь событий будет содержать все сообщения, относящиеся к приложению, включая такие вещи, как нажатия кнопок мыши, события движения мыши, события клавиатуры и события окна, такие как изменение размера и экспонирование.
Шаг «Обработать сообщение» возьмет событие и отправит его тому, что имеет отношение к событию. Так, например, щелчок мышью может привести к обратному вызову виджета Button. Или, если в вашей области рисования OpenGL настроен обратный вызов обработчика ввода, щелчок мыши приведет к вызову этой функции.
Вот несколько ресурсов, чтобы узнать больше об этом процессе:
Для Windows: http://en.wikipedia.org/wiki/Message_loop_in_Microsoft_Windows
Для X/Motif: http://www.unix.com/man-page/all/3x/XtAppMainLoop/
Если вы хотите увидеть конкретные шаги на этом пути (их много), вы можете попробовать установить точку останова в интересующей вас функции, например, в вашей основной процедуре отрисовки OpenGL или в функции обратного вызова ввода. Затем стек вызовов покажет вам, как вы туда попали.
person
MorbidFuzzball
schedule
28.08.2013