| | | | |
VCL.TBitmap.Утечка ресурсов в режиме 256 цветов | Полный текст материала
Другие публикации автора: Cepгей Poщин
Цитата или краткий комментарий: «... При создании и разрушении изображений TBitmap в режиме 256 цветов происходит утечка памяти, что наблюдалось в windows 2000 и windows 98. ...» |
Важно:- Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
- Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
- Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.
Добавить свое мнение.
Отслеживать это обсуждение
Всего сообщений: 719-03-2006 14:45сообщение от автора материала Спасибо, что откликнулись, но вы кажется не прочитали комментарий в конце статьи и ошибка в TBitmap есть и будет есть, хотя для её исправления требуется более глубокий анализ. Да действительно удаление, как бы происходит, но не до конца. Чтобы в этом убедиться измените процедуру InternalDeletePalette.
procedure InternalDeletePalette(Pal: HPalette);
begin
if (Pal <> 0) and (Pal <> SystemPalette16) then
if not DeleteObject(Pal) then raiselastosError;
end;
Я могу предположить, что палитра остается выбраной в контексте устройства и по тому и не удаляется. В любом случае утечка памяти происходит всегда, в том числе в BDS 2006. Описанное поведение программы — это лишь побочный эффект, который зависит от видеокарты, ОС, драйвера и фазы луны. Таким образом, решение 2 остается в силе (особенно в свете увеличения размеров оперативки), а решение 1 может быть использовано с особой осторожностью в некоторых частных случаях, по крайней мере оно указывает на то, что проблема в поллитре.
Кстати, ни с этим ли связан тот факт, что в качестве иконок компонентов IDE {$R *.dcr} можно использовать только 4- и 24-битные изображения? Может найдется сподвижник, который напишит об этой проблеме в Borland, пока не поздно.
P. S. А что во-вторых????? |
|
17-03-2006 13:55Во-первых, в классе TBitmap никаких ошибок нет и заменять except на finally в предложенном месте нельзя!
Дескриптор палитры передаётся в функцию TBitmap.NewImage, где имеется код:
var
Image: TBitmapImage;
begin
Image := TBitmapImage.Create;
with Image do
try
FHandle := NewHandle;
FPalette := NewPalette;
То есть, дескриптор сохраняется в TBitmapImage и, соответсвенно, удаляется в момент уничтожения TBitmapImage. Соответсвующий код прописан в методе:
procedure TBitmapImage.FreeHandle;
begin
if (FHandle <> 0) and (FHandle <> FDIBHandle) then
begin
DeselectBitmap(FHandle);
DeleteObject(FHandle);
end;
if FMaskHandle <> 0 then
begin
DeselectBitmap(FMaskHandle);
DeleteObject(FMaskHandle);
FMaskHandle := 0;
end;
InternalDeletePalette(FPalette);
FHandle := 0;
FPalette := 0;
end;
Так что VCL тут совершенно не причём. Если бы проблема была именно в VCL, то НА ВСЕХ МАШИНАХ С Win98 ваша программа вела бы себя одинаково. Когда мне в своё время приходилось сталкиваться с подобными проблемами, то в 99% случаев проблемы были в ДРАЙВЕРЕ ДИСПЛЕЯ! То есть, после смены версии драйвера или замены его на стандартный из самой Windows 98 (если таковой был), проблема обычно исчезала. Этим же скорее всего объясняется разное поведение на разных машинах. |
|
27-07-2005 02:37сообщение от автора материала Только мышь по экрану катается, а через некоторое время начинает хрюкать при перемещениях А у меня даже она умирала.
В Delphi 2005 после второго сервиспака, похоже, эта проблема устранена. Не знаю сами догадались, или прочли эту статью. |
|
16-07-2005 08:51Утечки это не так уж страшно. А вот как добится полного зависания системы на Win98. (Правдо если установить Delphi то зависать перестаёт, но эффект всёравно странный)
Просто в цикле грузим Bitmap из файла (скажем из таймера раз в секунду или по нажатию кнопки) с помощью стандартной функции
bmp.LoadFromFile(FileName);
Если в bmp файлы из списка true color то всё нормально цыкл будет выполнятсы сколь угодно долго. но стоит попасться bmp 256 то после 2-х (иногда даже семь раз загружалось) виснит сам Windows причем наглухо. Только мышь по экрану катается, а через некоторое время начинает хрюкать при перемещениях.
Под WinXP такой проблеммы не наблюдалось.
|
|
28-02-2005 06:00>> У меня, например, на кухне крыша тоже во время дождя протекает, это же не повод для ремонта крыши.
Я с вас балдею. Как это не повод?? |
|
22-02-2005 14:45сообщение от автора материала А чиво там проверять? Есть, однозначно. Вопрос: „насколько это опасно?”. Как я понимаю, библиотека в которой я предлагал сделать изменения существует неизменной уже не один год и, если то сих пор ни кого это не волновало, то переживать особенно не стоит. У меня, например, на кухне крыша тоже во время дождя протекает, это же не повод для ремонта крыши. Только при неудачном стечении обстоятельств, как в описанном выше случае может произойти зависание (которое, кстати, воспроизвести в маленьком примере неудалось). |
|
21-02-2005 07:54В тему! Как раз работаю с 256-ицветными палитрами и восьмибитными битмапами. Сейчас проверю, нет ли у меня утечки. |
|
|
|