У нас есть приложение MFC Visual-C ++, которое не реагирует ни на один пользовательский ввод.
(Примечание. В настоящее время известно только на одном компьютере. Такое поведение иногда повторяется, но толькопосле запуска приложения в течение нескольких дней!)
Приложение перерисовывается , когда мы переключаемся на него через Alt-Tab (или панель задач), но мы не можем, например,активируйте главное окно, нажав на строку заголовка.
Мы уже вытащили 4 дампа с WinDbg и проверили активные инструкции.Мы всегда были в некотором перерисовываемом коде или в каком-то подобном внутри основного потока (потока GUI).Мы определенно были / 101 * * не в модальном цикле сообщений, и стек основного потока всегда выглядел "хорошо".(Большинство / все рабочие потоки бездействовали, ожидая какого-либо события, там также нет подозрительного кода.)
При исследовании проблемы с Spy ++ мы видим также указанное поведение в этом отдельном вопросе , а именно о том, что мы, кажется, получаем сообщения рисования и активации, но пользовательский ввод не направляется в приложение .Когда у меня есть окно приложения на экране, и я выбираю его для отображения сообщений главного окна,
, оно будет показывать только "общие" сообщения "обновить" и ничего больше
Если я углублюсь и выберу все сообщения для всего процесса,
это то, что мы видим:
Приложение, по-видимому, обрабатывает сообщения только в одном скрытом подокне (00CB09F0), и мы видим постоянный поток 200 сообщений WM_PAINT в секунду.
Обычно это подокно вообще не обрабатывает никаких сообщений (кроме обновления WM_PAINT и т. Д., Когда Windows отправляет их).Обычно он используется как область рисования, и рисование происходит через сообщение WM_TIMER в его родительском (010A09B8) окне.(Однако это сообщение WM_TIMER также не отображается в зависшем приложении.)
Профиль производительности, показанный в проводнике процессов, выглядит примерно так (100% времени ядра, более или менее):