2010-03-18 5 views
3

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

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

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

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

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

Unresponsive app http://i42.tinypic.com/15ee8wo.jpg

+1

Эта страница [MSDN] (http://msdn.microsoft.com/en-us/library/dd744765 (VS.85) .aspx) говорит, что тайм-аут составляет пять секунд. – RyanCu

ответ

0

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

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

+0

Выполнение любых дорогостоящих вычислений или блокирование ввода-вывода в потоке пользовательского интерфейса в любом случае является неправильным ... – Hades32

+0

Конечно. Но я уже упоминал, что я работал над тем, чтобы вытащить материал из потока пользовательского интерфейса, но в любом случае хотел бы получить дно другой проблемы. –

+0

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

0

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

0

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

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

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

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

  • Нет связанных вопросов^_^