Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > непонятная ошибка


Автор: mrgloom 21.10.2011, 09:07
не могу детектировать ошибку или хотя бы понять откуда она идет.

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

с чем могут быть связаны ошибки такого рода? как это можно отлаживать? делать дамп памяти вариант? 

Автор: Earnest 21.10.2011, 13:35
Может, GDI-ресурсы утекают? Других мыслей нет, только некорректная работа с ресурсами при перерисовке. Должно наблюдаться через некоторое время работы программы. Посмотреть можно через Диспетчер задач. На закладке с процессами включи столбец Объекты GDI и последи за его изменением у своего процесса. Нормальное поведение - сначала нарастает до какого уровня, затем колеблется туда-сюда (при прорисовках, например). Если все время растет - ищи ошибки некорректного освобождения GDI-ресурсов.

Автор: mrgloom 21.10.2011, 16:19
да, действительно посмотрел, копится, доходит до 10к и потом все начинает неправильно работать.


как то точнее можно отследить где происходит утечка?

Автор: mrgloom 21.10.2011, 17:09
похоже я не удалял пены.


HPEN yellowPen=CreatePen(PS_SOLID, 1, RGB(255,255,0)); 
HGDIOBJ oldPen=SelectObject(dc,yellowPen);
DeleteObject(yellowPen);

Цитата

This function returns the previously selected object of the specified type. An application should always replace a new object with the original, default object after it has finished drawing with the new object.


не очень понятно зачем старый объект возвращать обратно?

Автор: Estranged 21.10.2011, 21:51
Цитата(mrgloom @  21.10.2011,  17:09 Найти цитируемый пост)
не очень понятно зачем старый объект возвращать обратно? 

Чтобы вернуть его на родину вместо удаляемого, причем http://msdn.microsoft.com/en-us/library/dd183539%28v=vs.85%29.aspx, иначе будет плохо:
Код

HPEN yellowPen=CreatePen(PS_SOLID, 1, RGB(255,255,0)); 
HGDIOBJ oldPen=SelectObject(dc,yellowPen);
SelectObject (dc, oldPen); <--------
DeleteObject(yellowPen);


или:
Код

HPEN yellowPen=CreatePen(PS_SOLID, 1, RGB(255,255,0)); 
HGDIOBJ oldPen=SelectObject(dc,yellowPen);
DeleteObject(SelectObject (dc, oldPen));

Автор: Earnest 24.10.2011, 06:41
Цитата(Estranged @  21.10.2011,  22:51 Найти цитируемый пост)
 иначе будет плохо

Другими словами, объект, выбранный в контекст, на самом деле не удаляется. Это одна из самых больших засад GDI, которые нужно иметь в виду при написании кода. "Развыбрать" объект можно одним способом - заменить другим такого же типа. Не обязательно старым, для этих целей подходят также stock-объекты.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)