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

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

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

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

Вопросы:

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

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

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

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


person RED SOFT ADAIR    schedule 09.08.2011    source источник
comment
Это кричит для фонового рабочего потока.   -  person Deanna    schedule 09.08.2011
comment
отключил всю ненужную обработку сообщений - MSDN довольно ясно говорит по этому поводу: если [оконная процедура] не обрабатывает сообщение, она должна отправить сообщение обратно в систему для обработка по умолчанию. Оконная процедура делает это, вызывая функцию DefWindowProc.   -  person MSalters    schedule 09.08.2011


Ответы (2)


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

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

person David Heffernan    schedule 09.08.2011
comment
Спасибо за Ваш ответ. В документации говорится, что двоение окна - это функция диспетчера Windows, которая позволяет пользователю свернуть, переместить или закрыть главное окно приложения, которое не отвечает. В нем ничего не говорится об отключении зависшей заметки. Вы знаете что-нибудь об этом больше? - person RED SOFT ADAIR; 09.08.2011
comment
Когда вы отключите привидение, вы не увидите никакого (не отвечающего) текста, прикрепленного к подписи и т. Д. - person David Heffernan; 09.08.2011
comment
Также с точки зрения UX, используя другой поток, вы можете использовать текущий, чтобы дать пользователю обратную связь о ходе выполнения его задачи. - person Ben; 09.11.2012

Я обнаружил, что приложению не нужно выполнять фактическую обработку сообщения, чтобы предотвратить состояние (не отвечающее) при выполнении блокирующей задачи в основном потоке.

Просто нужно периодически звонить:

PeekMessage(&msg, 0, 0, 0, PM_NOREMOVE);
person Jusid    schedule 26.02.2021