Странное повреждение дисплея управления в приложении MFC

У меня странная проблема, которую я не смог диагностировать, и я надеюсь, что кто-то может, по крайней мере, указать мне правильное направление. У меня есть приложение C ++ MFC, которое собирает данные из различных источников и отображает их на экране. Однако после случайного интервала (обычно около 5-10 минут) дисплей «повреждается» так, как я никогда не видел или не смог отследить, как показано на рисунке ниже (слева — нормально, справа — повреждено). ):

Пример искажения отображения

Основные симптомы:

  • Стрелки вверх / вниз превращаются в «5» и «6».
  • Открытие списка со списком приводит только к отображаемому тексту элемента (граница списка и полоса прокрутки не отображаются).
  • Цвета фона на некоторых элементах управления не обновляются или отображаются неправильно.
  • Z-порядок нарушен, и приложение контролирует «утечку» через другие окна, расположенные сверху.
  • Нажатие Print-Screen с приложением в фокусе больше не захватывает окно в буфер обмена.
  • Закрытие и повторное открытие окна ничего не делает.
  • Перезапуск приложения возвращает все в нормальное состояние.

Вещи, которые я пытался устранить в качестве возможной причины, включают в себя:

  • Операционная система & Компьютер: Та же проблема присутствует на различных системах от Windows 7-64 бит до Windows Xp-32 бит.
  • Многопоточность: Я добавил мьютекс, чтобы предотвратить одновременное обновление экрана, но это не дало эффекта (как и ожидалось).
  • Повреждение памяти: Это было мое предположение все время, но нет никаких признаков повреждения памяти вообще. Базовый код дисплея использовался в течение многих лет без каких-либо схожих проблем, как и библиотека базовых сетевых сообщений.
  • Специальный код: Я сузил проблему до одного конкретного диалога среди множества других, которые не показывают проблемы. Все они используют один и тот же базовый код, который, кажется, указывает на то, что проблема заключается в конкретном коде отображения для диалога. Как и почему проблема возникает, ускользает от меня до сих пор.

Любые идеи о том, что может быть причиной или как сузить это было бы здорово.

Обновление 1:
Выполнение некоторых временных / повторяемых тестов, и похоже, что это ненадолго запустило одно диалоговое окно, что вызывает проблему. Время показа составляет от 300 до 400 секунд до появления проблемы.

0

Решение

Похоже, что ваше приложение может пропускать объекты GDI. Чтобы проверить, так ли это, откройте диспетчер задач и включите GDI Objects колонка. Наблюдайте за числом для вашего процесса и посмотрите, будет ли он постоянно расти.

Если это действительно так, вы должны прочитать Обнаружение и устранение утечек GDI в вашем коде с помощью двух мощных инструментов для Windows XP. Эта статья MSDN также предлагает инструмент под названием GDILeaks.exe это должно помочь вам определить ваши утечки GDI.

В случае, если эти симптомы появляются в течение короткого времени, это должно быть что-то, что обращается многократно, что не освобождает ресурсы GDI должным образом. Возможно в (или вызванной в) процедуре Windows (например, OnPaint).

1

Другие решения

Если я не ошибаюсь, Windows GUI использует шрифт ttf (?) Для этих маленьких иконок, и похоже, что шрифт как-то разрушается (DeleteObject вызывается с дескриптором шрифта?)

0

По вопросам рекламы [email protected]