Eugie » 08 сен 2005, 13:41
Euqie, Что ты подразумеваешь под owner-ом MessageBox-а ?
Окно с хендлом hwnd, которое передается первым параметром?
Именно
Я думаю, что функция "MessageBox" синхронная (не знаю, имел ли в виду ssDev под словом "блокирующая" то же самое).
Синхронная -- значит, не передает управление следующей инструкции, пока не завершит свое выполнение.
В этом смысле - да. Но не все так просто. MessageBox, как и любой модальный диалог Windows, при создании запускает собственный цикл сообщений (message pump) и не выходит из него, пока диалог не будет закрыт (т.е. является синхронной функций в твоем понимании). Это не все. Специфика модальности ввода, как она реализована в Windows, предусматривает еще блокировку (disabling) окна-владельца. Но если нет владельца (соотв.параметр NULL), то и блокировки нет. Выглядит это в типичном GUI приложении как
возможность переключиться на любое другое незаблокированное окно приложения - например, вызвать меню для главного окна. Вот что имел в виду ssDev. Все это время обрабатывать сообщения будет не главный цикл приложения, а цикл диалогового окна. В этом смысле мы из диалога не выходим, пока он не будет закрыт. Для твоего примера с консольным приложением эффект блокировки достигается именно поэтому: других окон нет и переключиться некуда, а поток управления, действительно, стоит в MessageBox до его закрытия.
Насчет ситуации с деструктором. Я не знаком с исходниками Windows
но уверен, что системные функции типа GetMessage/PeekMessage, которые используются при организации цикла сообщений, проверяют наличие валидной
очереди сообщений, а она к моменту вызова деструктора
главного окна приложения уже скорее всего разрушена/невалидна. Если вызывать MessageBox в деструкторе любого подчиненного окна, думаю, никаких проблем не будет .
[quote]Euqie, Что ты подразумеваешь под owner-ом MessageBox-а ?
Окно с хендлом hwnd, которое передается первым параметром?[/quote]
Именно
[quote]Я думаю, что функция "MessageBox" синхронная (не знаю, имел ли в виду ssDev под словом "блокирующая" то же самое).
Синхронная -- значит, не передает управление следующей инструкции, пока не завершит свое выполнение.[/quote]
В этом смысле - да. Но не все так просто. MessageBox, как и любой модальный диалог Windows, при создании запускает собственный цикл сообщений (message pump) и не выходит из него, пока диалог не будет закрыт (т.е. является синхронной функций в твоем понимании). Это не все. Специфика модальности ввода, как она реализована в Windows, предусматривает еще блокировку (disabling) окна-владельца. Но если нет владельца (соотв.параметр NULL), то и блокировки нет. Выглядит это в типичном GUI приложении как [i]возможность[/i] переключиться на любое другое незаблокированное окно приложения - например, вызвать меню для главного окна. Вот что имел в виду ssDev. Все это время обрабатывать сообщения будет не главный цикл приложения, а цикл диалогового окна. В этом смысле мы из диалога не выходим, пока он не будет закрыт. Для твоего примера с консольным приложением эффект блокировки достигается именно поэтому: других окон нет и переключиться некуда, а поток управления, действительно, стоит в MessageBox до его закрытия.
Насчет ситуации с деструктором. Я не знаком с исходниками Windows ;) но уверен, что системные функции типа GetMessage/PeekMessage, которые используются при организации цикла сообщений, проверяют наличие валидной [i]очереди сообщений[/i], а она к моменту вызова деструктора [i]главного окна приложения[/i] уже скорее всего разрушена/невалидна. Если вызывать MessageBox в деструкторе любого подчиненного окна, думаю, никаких проблем не будет .