Занятое приложение приводит к ложному состоянию «Не отвечает» в Windows 7 - WM_UPDATE - PullRequest
8 голосов
/ 09 августа 2011

Во время длительных операций наше приложение C ++ Win32 отображает диалог модального состояния с панелью процессов, которая обновляется нерегулярно каждые несколько секунд или около того. Начиная с Windows 7, мы поняли, что Windows довольно скоро показывает сообщение «кажется, что зависает ...» и / или добавляет «Не отвечает» в строке заголовка нашего окна.

Мы выяснили, что диалог процесса должен обрабатывать сообщения, чтобы избежать этого. В частности, кажется, что Windows 7 постоянно отправляет сообщения WM_UPDATE, чтобы проверить, жива ли наша программа. Ранее мы отключили всю ненужную обработку сообщений в этом диалоговом окне, поскольку профили показывают, что они значительно замедлились.

Но хотя мы думали, что исправили эту проблему, пользователи снова сообщают о таких проблемах: Windows показывает «кажется, что зависает ...» и / или добавляет «Не отвечает» в строку заголовка окна, хотя мы обрабатываем все события каждые несколько секунд.

Вопросы:

  • Есть ли документация об этом изменении поведения в Windows 7 (или Windows Vista)? Мы не нашли ни одного. Мы также обнаружили ряд других изменений в поведении сообщений.

  • Можно ли как-то отключить все такие проверки "в живых" из окон? Наше приложение довольно хорошо работает, и процессы могут занять довольно много времени.

РЕДАКТИРОВАТЬ: Чтобы быть более конкретным - то, что мы делаем только каждые несколько секунд, вызывает насос сообщений PeekMessage / TranslateMessage / DispatchMessage.

Поскольку это довольно старая унаследованная программа, использование отдельного рабочего потока в ближайшем будущем невозможно. Мы, конечно, делаем это для нового кода. Также обратите внимание, что моя главная мысль заключается в том, что это поведение определенно изменилось с Windows Vista / Windows 7. Я не нашел никакой документации по этому поводу.

1 Ответ

18 голосов
/ 09 августа 2011

Ну, прямой ответ на ваш вопрос заключается в том, что вы можете позвонить DisableProcessWindowsGhosting().

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

...