![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Катастрофическое уплывание ресурсов
valery_f © (2001-12-26 15:03:00)После создания (через API) и пользования GDI объектов удаляю их через DeleteObject. Все хорошо, но в некоторых случаях (особенно если частые перерисовки) GDI ресурсы резко начинают уплывать вплоть до нуля, причем после закрытия программы они не восстанавливаются - только перезагрузка. Впервые я заметил это на метафайлах, потом оказалось - с Pen/Brush иногда бывает то же самое. Такое чувство, что DeleteObject на самом деле ничего не удалило... :((( Что это?
valery_f (2001-12-26 17:24:00) [1]Спасибо, насчет "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" винда создает еще какие-то объекты и с ними надо что-то делать?
Mirovodin (2001-12-26 16:21:00) [2]Используй отладчик Mem proff http://www.automatedqa.com/или BoundsChecker http://www.numega.comОчень помогают отследить утечки ресурсов, причем Mem proff прямо дает дельные советы по их устранению.
Юрий Зотов (2001-12-26 16:09:00) [3]Дополнение.
Попробуйте везде заменить вызов DelectObject на такой:
Win32Check(DelectObject(...));
Тогда, по идее, если DelectObject вернет False, то будет автоматически вызвана GetLastError и сгенерено исключение с системным сообщением. Это может помочь в диагностике.
Юрий Зотов (2001-12-26 15:55:00) [4]Вот ремарка из описания 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 и не назначаются ли битмапы для кистей.