Подтвердить что ты не робот

Родительское окно зависает, когда дочернее окно зависает от другого процесса

Отказ от ответственности. Я не знаком с Win32 API, особенно с тем, как работают окна.

Я хотел бы сделать окно какого-либо процесса дочерним окном другого процесса. Эти два процесса также являются родительскими и дочерними. Но я не думаю, что это важно. Пока все работает как шарм - пока я не замораживаю основной поток дочернего окна.

Представьте себе контейнер .exe, что "hosts" notepad.exe и someApplication.exe

Когда я приостанавливаю основной поток someApplication.exe в течение нескольких секунд, его окно замерзает на такое количество времени. Это совершенно понятно. Но окно container.exe будет также зависать в одно и то же время. Детские окна других размещенных процессов (например, notepad.exe) будут продолжать работать нормально.

Я использую команду SetParent, чтобы сделать обычное не-дочернее окно дочерним элементом моего container.exe:

SetParent(
    childProcess.HWND,
    myOwnHWND
);

После этого я использую setWindowPos:

SetWindowPos(
    childProcess.HWND,
    HWND_TOP,
    someXPos,
    someYPos,
    0,
    0,
    SWP_FRAMECHANGED or SWP_NOSIZE or SWP_SHOWWINDOW
)

Как показывает статья статьи MSDN в SetParent, я также очищаю атрибут стиля WS_POPUP и добавляю атрибут WS_CHILD. Поскольку это тоже не помогло, я также добавил атрибут WS_EX_NOACTIVATE расширенного стиля, используя команду SetWindowLongPtr. Наконец, я попытался отправить оба окна WM_UPDATEUISTATE, а затем сообщение WM_CHANGEUISTATE, но это также не изменило ничего.

То, что меня смущает, состоит в том, что окно родительского процесса продолжает рисоваться нормально, пока я не коснусь его. Затем он полностью замораживается, пока дочернее окно не размораживается. Я подозреваю, что что-то называется "входной очереди". статья MSDN о сообщении WM_ACTIVATE гласит:

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

Из-за этого я возлагал большие надежды на атрибут расширенного стиля WS_EX_NOACTIVATE.

Подводя итог: действительно ли возможно разместить окно другого процесса и не замораживать собственное окно, когда дочернее окно зависает?

4b9b3361

Ответ 1

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

Однако, устанавливая отношения между родителями и дочерними процессами между окнами этих процессов, вы также вводите требование о том, чтобы оба потока графического интерфейса были удовлетворены своевременно.

Windows, которые находятся в родительском/дочернем соединении, отправят друг другу сообщения. И если эти сообщения синхронны, они отправляются, а не отправляются, то блокирование одного потока GUI приведет к блокировке другого.

Золотое правило программирования GUI остается в силе: не блокируйте нить GUI. Если у вас многолетняя задача, переместите ее в фоновый поток.

Обновление

ОК, как описано здесь, когда вы связываете окна из разных потоков, вы присоединяете свои очереди сообщений друг к другу. Итак, если вы блокируете один поток, вы блокируете все прикрепленные потоки.

Итак, не блокируйте поток GUI.