DWM и рисование неотвечающих приложений - PullRequest
3 голосов
/ 18 марта 2010

В Vista и более поздних версиях, если приложение перестает отвечать на запросы, диспетчер окон рабочего стола может обрабатывать его перерисовку, когда это необходимо (переместить окно поверх него, перетащить его и т. Д.), Поскольку для него сохранен пиксельный буфер. Windows также пытается определить, когда приложение перестает отвечать на запросы по истечении некоторого времени ожидания, и пытается извлечь максимальную пользу из ситуации - я считаю, что она затемняет окно, добавляет «Не отвечает» в строку заголовка и, возможно, некоторые другие эффекты.

Теперь у нас есть приложение со скинами, которое использует области окон и многослойные окна, и оно не очень хорошо справляется с этими эффектами. Мы разрабатывали на XP, но заметили странный эффект при тестировании на Vista. В некоторых моментах приложение может потратить несколько минут на некоторые вычисления или обратный вызов, и «если сообщение не было получено в течение 5 секунд, DWM объявляет окно зависшим» ( MSDN - Предотвращение зависаний в приложениях Windows ). Кажется, что когда это происходит, возникает странная графическая проблема: любые пиксели, которые будут на 100% прозрачными из-за областей окна, становятся черными, что фактически делает окно снова прямоугольным с черным фоном. Кажется, есть и другие аномалии, когда пиксели исходного окна немного смещены в некоторых дочерних диалогах.

Я работаю над уменьшением таких задержек (в идеале, Windows никогда не нужно будет вмешиваться, как это), и пытаюсь поддерживать отзывчивость, пока она занята, но я все же хотел бы выяснить, что заставляет ее так рендериться, поскольку я не могу гарантировать, что могу устранить все задержки.

По сути, я просто хотел бы знать, что делает Windows, когда это происходит, и как я могу заставить свое приложение правильно работать с ним. Приложения со скинами все еще должны работать в Vista и более поздних версиях, поэтому мне нужно выяснить, что я делаю, это нестандартно. Я даже не знаю точно, как искать информацию о том, как Windows теперь обрабатывает приложения, не отвечающие на запросы, так как мои поиски возвращают только людей, имеющих проблемы с приложениями, которые не отвечают, или очень элементарных объяснений того, что DWM делает с такими приложениями. Черт возьми, я даже не уверен на 100%, что ответственность за это несет DWM, но это кажется вероятным. Есть потенциальные потенциальные клиенты?

фотография проблемы; снимки экрана не отражают эффект (обратите внимание, что буфер белого диалога смещен - он смещен точно на расстояние, на которое он был смещен от основного (синего) окна):

Unresponsive app

Ответы [ 3 ]

0 голосов
/ 28 апреля 2010

Я обнаружил, что когда это происходит, его называют «призрачным», и он был введен в XP (хотя, похоже, DWM продвигается дальше, так как отслеживает пиксели каждого приложения). Можно отключить его на время жизни вашего приложения с помощью DisableProcessWindowsGhosting(). Некоторые люди говорят, что это не рекомендуется, но, учитывая, насколько плохо он играет со слоистыми окнами, недостатки его отключения незначительны. Я проверил это, и он делает именно то, что заявляет; теперь, если сервер вернется немного дольше, чем ожидалось, он не будет портить весь интерфейс.

Если есть лучший способ заставить мои многоуровневые окна работать с обработкой двоичных изображений в Vista / 7, не отключая ее напрямую, я, безусловно, по-прежнему буду заинтересован, но, скорее всего, я просто приму это как ответ.

0 голосов
/ 23 августа 2015

Я думаю, что есть две вещи, которые помогут с этим:

Во-первых, как вы это делали, постарайтесь не зависать в первую очередь: сделайте как можно меньше тяжелой работы в потоках интерфейса пользователя.

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

0 голосов
/ 18 марта 2010

Это стандартное поведение; вы также можете заметить это в Office 2007/2010, когда они замерзают.

...