MoveWindow тупик? - PullRequest
       8

MoveWindow тупик?

1 голос
/ 21 апреля 2009

У меня есть окно в потоке A, которое в какой-то момент (в результате получения сообщения от его wndproc) запускает действие в потоке B, а затем ожидает завершения действия (используя некоторый механизм синхронизации ). Затем поток B вызывает MoveWindow(), чтобы переместить дочернее окно в окно потока A (например, стандартное текстовое поле). В этот момент программа по какой-то причине переходит в тупик. Если MoveWindow() вызывается из потока А, все работает. Есть идеи почему?

Ответы [ 5 ]

2 голосов
/ 22 апреля 2009

Я думаю, что объяснение @ 1800 пока самое близкое.

Когда вы перемещаете окно из потока, которому это окно не принадлежит, я думаю, что Windows не использует SendMessage для доставки таких вещей, как WM_WINDOWPOSCHANGING, в процедуру окна перемещенного окна. Вместо этого, чтобы гарантировать, что оконная процедура вызывается только в правильном потоке, она отправляет сообщение WM_WINDOWPOSCHANGING и блокирует, пока она не будет выбрана циклом обработки событий в правильном потоке. Однако этот цикл событий не работает - он заблокирован, ожидая завершения MoveWindow.

Решения от @totaland и @Logan Capaldo будут работать.

Может быть, вам не нужно ждать, пока ваше окно не сдвинется. Или, если вам нужно быть уверенным, используйте MsgWaitForMultipleObjectsEx и запустите небольшой цикл обработки событий для обработки отправленных сообщений.

2 голосов
/ 21 апреля 2009

Вы можете использовать SetWindowPos с флагом SWP_ASYNCWINDOWPOS вместо MoveWindow.

Причиной может быть то, что ThreadA ожидает, пока ThreadB обработает какое-либо событие, но тем временем ThreadB ожидает, пока ThreadA (поток, владеющий окном) вернет результат MoveWindow.

2 голосов
/ 21 апреля 2009

Что такое «какой-то механизм синхронизации»? Если это WaitFor (Multiple) Object (s), вы можете использовать [MsgWaitForMultipleObjects] (http://msdn.microsoft.com/en-us/library/ms684242(VS.85).aspx)( Ex вместо пробуждения, когда у вас сообщение и отправьте его, как предполагает Лусеро.

1 голос
/ 21 апреля 2009

Сходство потоков объектов интерфейса пользователя, часть 1: дескрипторы окон :

Различные объекты имеют разные правила сродства потока, но основные принципы исходят из 16-битного Окна.

Самый важный пользовательский интерфейс Элемент, конечно, окно. Объекты окна имеют сходство потоков. Поток, который создает окно тот, с которым у окна есть неразлучные отношения. Неформально, один говорит, что нить "владеет" окно. Сообщения отправляются на оконная процедура только в потоке который владеет им, и вообще говоря, изменения в окне должны быть сделано только из темы, которой принадлежит Это. Хотя оконный менеджер разрешает любому потоку доступ к таким вещи как свойства окна, стили, и другие атрибуты, такие как оконная процедура и такие доступы Поток безопасен из окна точка зрения менеджера, последовательности загрузки-изменения-записи должны обычно ограничивается владельцем нить.

1 голос
/ 21 апреля 2009

Необходимо убедиться, что насос сообщений потока работает, пока вы ожидаете.

Возможно, вы захотите выполнить цикл с PeekMessage () (или, возможно, GetMessage () ) и DispatchMessage () .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...