Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.25;
Скачать: [xml.tar.bz2];




Вниз

Катастрофическое уплывание ресурсов 


valery_f   (2001-12-26 15:03) [0]

После создания (через API) и пользования GDI объектов удаляю их через DeleteObject. Все хорошо, но в некоторых случаях (особенно если частые перерисовки) GDI ресурсы резко начинают уплывать вплоть до нуля, причем после закрытия программы они не восстанавливаются - только перезагрузка. Впервые я заметил это на метафайлах, потом оказалось - с Pen/Brush иногда бывает то же самое. Такое чувство, что DeleteObject на самом деле ничего не удалило... :((( Что это?



Юрий Зотов   (2001-12-26 15:55) [1]

Вот ремарка из описания DelectObject.

Remarks

Do not delete a drawing object (pen or brush) while it is still selected into a device context.
When a pattern brush is deleted, the bitmap associated with the brush is not deleted. The bitmap must be deleted independently.

То есть - проверьте, как у Вас используется SelectObject и не назначаются ли битмапы для кистей.



Юрий Зотов   (2001-12-26 16:09) [2]

Дополнение.

Попробуйте везде заменить вызов DelectObject на такой:
Win32Check(DelectObject(...));

Тогда, по идее, если DelectObject вернет False, то будет автоматически вызвана GetLastError и сгенерено исключение с системным сообщением. Это может помочь в диагностике.



Mirovodin   (2001-12-26 16:21) [3]

Используй отладчик Mem proff http://www.automatedqa.com/ или BoundsChecker http://www.numega.com Очень помогают отследить утечки ресурсов, причем Mem proff прямо дает дельные советы по их устранению.



valery_f   (2001-12-26 17:24) [4]

Спасибо, насчет "selected into DC" я как то не подумал :) Ну, насчет кистей и пр. я понял. А как быть с метафайлами? Вот кусок кода, который, будучи прокручен несколько сотен раз (просмотр файлов перед импортом) опускает GDI ресурсы до нуля:

hMetafile := GetEnhMetaFile(PChar(Filename));
if hMetafile = 0 then ..
try
GetEnhMetaFileHeader(hMetafile,SizeOf(TEnhMetaHeader),@EMF);
...
PlayEnhMetaFile(Bmp.Canvas.Handle,hMetafile,r);
finally
DeleteEnhMetaFile(hMetafile);
end;

Может во время "PlayEnhMetaFile" винда создает еще какие-то объекты и с ними надо что-то делать?




Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.25;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.72 MB
Время: 0.016 c
3-79282           knyaz17               2002-01-31 12:23  2002.02.25  
Как сохранить DBF файл в кодировке CP 866?


3-79297           tatk                  2002-01-30 19:16  2002.02.25  
Результат запроса -> в переменную (массив)


14-79473          evgeg                 2002-01-05 09:03  2002.02.25  
Вот тебе, бабушка, и BeOs.


1-79394           Lexan                 2002-02-05 18:59  2002.02.25  
Вопрос про поиск папок


1-79328           IronHawk              2002-02-07 11:03  2002.02.25  
Приветствую Мастеров ! Запамятовал, КАК В PageControl ПОМЕНЯТЬ МЕСТАМИ TabSheet-ы ???