Jaa


Оконному менеджеру нужна обработка очереди сообщений, чтобы уведомить вас, когда вы не ожидаете его явно

Есть несколько разных способов попросить оконный менеджер уведомить вас, когда произойдет что-нибудь интересное. Результатом некоторых из таких способов является непосредственное возвращение запрошенных данных в синхронном режиме. Функции перечисления чего-либо являются классическим примером таких операций. Если вы вызовете функцию EnumWindows и передадите ей ссылку для обратного вызова, то этот обратный вызов будет совершен непосредственно из вызываемой функции — EnumWindows.

С другой стороны, есть гораздо более многочисленный класс операций, которые возвращают результат или в другом потоке, или в вашем потоке, но не в виде непосредственного и мгновенного возвращения результатов из вызываемой функции. К примеру, если вы используете функцию SendMessageCallback и оконному менеджеру требуется вызвать функцию, переданную по ссылке обратного вызова, то ему нужно каким-то образом получить возможность выполняться в вашем потоке. Он не может самовольно прервать выполнение вашего кода, эта дорога ведет к хаосу и сумасшествию. Таким образом, мы ищем какой-либо способ передать оконному менеджеру управление центральным процессором в тот момент времени, когда программа находится в стабильном, реентерабельном состоянии.
Таким моментом времени является обработка очереди оконных сообщений. Это одна из тех операций, относительно которой оконный менеджер имеет некоторую уверенность в том, что программа периодически будет выполнять ее. Это решает первую задачу: как получить доступ к управлению центральным процессором.

Кроме того, доподлинно известно, что когда вы вызываете функции GetMessage или PeekMessage, оконные сообщения, отправленные вашей программе, будут обработаны, а для этого программе лучше всего быть в стабильном, реентерабельном состоянии на момент вызова этих функций. Это решает вторую задачу: как получить доступ к управлению центральным процессором, когда программа находится в стабильном состоянии.

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

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