Страницы

Поиск по вопросам

среда, 30 января 2019 г.

Как MessageBox останавливает выполенение кода?

Как MessageBox останавливает выполенение кода, до тех пор, пока пользователь не нажмёт на кнопку? Что-то типа _getch()?


Ответ

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

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

Комментариев нет:

Отправить комментарий