Страницы

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

суббота, 4 января 2020 г.

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

#cpp #c #winapi


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


Ответы

Ответ 1



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

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

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