2010-08-16 3 views
2

У меня есть довольно общее понимание потока GUI и цикла сообщений, но мне любопытно, как это относится к одному окну, начиная модальное окно. Если бы я должен был догадаться, я бы сказал, что оба окна запускаются под одним и тем же потоком GUI и что какой-то параметр указывает, что будут выполняться только события с дочерним окном (модальным), в противном случае указать модальное окно пользователю ,Какой поток обрабатывает модальные диалоговые окна в .Net?

Это просто полуобразованное предположение, и я согласен с тем, что я ошибаюсь из квадратного. Я даже не уверен, что «поток GUI» - это правильное название для этого потока, но люди обычно могут догадываться, о чем я говорю.

Итак, как работают потоки и модальные окна вместе?

+1

Открытие модального диалога является блокирующим вызовом. Вызывающее окно ждет завершения модального диалога перед тем, как обработать больше событий. –

+0

@Robert Harvey, так же как модальное окно работает в новом потоке, пока родительское окно заблокировано? Что именно это подразумевает для событий родительского окна, таких как перекраска? –

+0

Мое понимание заключается в том, что модальный диалог по-прежнему работает в главном потоке графического интерфейса. Если вы хотите, чтобы обработка выполнялась в фоновом режиме (включая перерисовку основной формы), пока отображается модальный диалог, вам нужно открутить новый поток для запуска фонового процесса. –

ответ

4

Возможно, это противоречиво, но нет новых потоков для новых окон. Тем не менее, новый цикл сообщений открывается. Это позволяет отправлять сообщения через Windows и избегать остановки других приложений.

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

В качестве примера, к которому вы уже коснулись своего вопроса, WM_PAINT отправляется в родительское окно. Но также, например, WM_TIMER. Сообщение, подобное WM_NCHITTEST, не будет отправлено, поскольку это входное сообщение. Также не будет WM_KEYDOWN и тому подобное.

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

Информация частично от Rector and Newcomer's Win32 Programming, страница 752+, старая, но по-прежнему ценная и действительная информация. Эта информация относится к DialogBox, DialogBoxParam, DialogBoxIndirect и DialogBoxIndirectParam, а также к любой из версий ..Ex. Внутри эти функции Win32 API вызывается WinForms.

+0

«старый» - но эти части Windows еще старше –

+0

@ Тит, это правильно :) Я попытался найти его источник, но кажется, что [самая старая ссылка Microsoft использует Windows 2000] (http://msdn.microsoft .com/en-us/library/ms645452.aspx), никакой функции, даже ['WinMain'] (http://msdn.microsoft.com/en-us/library/ms633559.aspx), идет дальше. – Abel

+0

@Abel, это хорошая история перезаписи истории :). Предположительно, эти номера версий в MSDN: _min (версия для Windows, поддерживаемая Microsoft, появилась первая функция версии Windows). Я должен проверить свою версию Windows Petzold. –

0

Окно, а точнее сообщения окна, обрабатывается потоком, который создал окно: CreateWindowEx. Это может быть косвенным, со слоями программного обеспечения между кодом приложения и вызовом API CreateWindowEx, но вызов будет всегда появляться при создании нового окна.

4

Оба окна остаются в одной и той же резьбе. Этот поток - поток GUI - продолжает обрабатывать сообщения для обоих окон.

Что особенное модальный диалог является: владелец

  • диалогового установлен в главном окно. Это заставляет диалог всегда отображаться поверх главного окна. It's possible to do this with modeless windows.

  • Окно владельца прекращает принимать пользовательский ввод (сообщения мыши и клавиатуры), когда диалог открыт. Диалоговое окно вводит пользовательский ввод как обычно. Это достигается отключением окна владельца, таким же образом, что вы можете отключить элемент управления в диалоговом окне.

+0

Примечание: возможно, конечно, установить владельца в другое окно, например (что часто делается неправильно для младших программистов), на рабочем столе. – Abel

+0

Случайный вопрос стороны, есть ли преимущество установки владельца окна на рабочий стол? Я никогда не слышал об этом. –

+0

Нет никакого преимущества. Недостатком является то, что он разбивает Windows. –

0

Модальных диалоговых окон
https://msdn.microsoft.com/en-us/library/windows/desktop/ms644994(v=vs.85).aspx

Для обработки сообщений для модального диалогового окна, система запускает свой собственный цикл сообщений, принимая временный контроль очереди сообщений для всего приложения. Когда система получает сообщение, которое явно не указано в диалоговом окне, оно отправляет сообщение в соответствующее окно. Если он извлекает сообщение WM_QUIT, он отправляет сообщение обратно в очередь сообщений приложения, так что основной цикл сообщения приложения может в конечном итоге получить сообщение.

Смежные вопросы