![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Утечка памяти при
Lev © (2003-09-12 13:10:00)
Прошу помочь со следующей проблемой.
Я сделал простенький просмотрщик картинок (изображения формата JPEG). Изображения (масштабированные) помещаются в Grid (однострочный). При простой прокрутке грида происходит непонятная мне катастрофическая утечка физической памяти. Технология такая: в OnCreate формы картинки загружаются в Objects ячеек грида:
...
var
j :integer;
pct :tpicture;
...
with stringrid1 do
for j:=0 to colcount-1 do
begin
pct:=tpicture.create;
pct.loadfromfile(fname[j]); //fname[j] - массив с именами файлов
objects[j,0]:=tobject(pct);
end;
...
В процедуре для события OnDrawCell сетки картинки рисуются:
...
with sender as StringGrid do
if (acol>=0) and (arow>=0) then
begin
rect:=scaling(tpicture(objects[acol,0]),rect);
{scaling - функция для пропорционального масштабирования изображения по размерам ячейки сетки}
canvas.strechdraw(rect,tpicture(objects[acol,0].graphic)
end;
...
С чем может быть связано утекание памяти и как с ним бороться?
Sapersky (2003-09-15 17:01:00) [1]
Какая в данном случае разница?
Кажется, никакой :) Я это посоветовал по старой памяти - были какие-то глюки в своё время. Я полагал, что событие OnCreate возникает до создания компонентов, лежащих на форме. Сейчас специально посмотрел - до Delphi3 включительно действительно так, начиная с Delphi4 OnCreate возникает после создания всех компонентов. Так что проблем из-за этого быть не должно.
Но я всё равно пишу инициализацию в OnShow :)
AlexT1000 (2003-09-15 14:03:00) [2]
если у тебя D5 скачай updatePack . у меня вроде тоже такая хрень была. по идее должно помочь.
ZEE (2003-09-15 11:39:00) [3]
В чем проявляются эти "утечки памяти"?
Если в том что доступной физической памяти становится меньше - то это не утечка - просто надо ж куда-то девать картинки, которые ты открываешь в просмотре.
Конечно если идет доступной памяти все меньше, а кол-во загруженных объектов не увеличивается (точнее не должно было увеличиваться) - то вот тут что-то не так...
а конкретнее - после создания и использования картинок
pct:=tpicture.create;
...
надо все-таки Free делать,
или не создавать каждый раз новые, а юзать ранее созданные...
Lev (2003-09-15 11:07:00) [4]
>Verg, Hooch
scaling - моя процедура, я уверен, что дело не в ней, т.к. я сам, заподозрив что-то с ней связанное, ее просто отключал (т.е. не масштабировал картинки при помещении в сетку), но никакой разницы не было - те же утечки памяти при прокрутке
>Hooch
Конечно, я освобождаю object[i,j] при закрытии, но ведь утечки не при закрытии, а при работе формы - при прокрутке
>Sapersky
Какая в данном случае разница?
Sapersky (2003-09-12 14:50:00) [5]
Создавать лучше в OnShow, уничтожать в OnHide (а не OnCreate/OnDestroy). Если, конечно, это главная форма.
Hooch (2003-09-12 13:29:00) [6]
либо в scaling косяк
Hooch (2003-09-12 13:28:00) [7]
а при закрытии фоормы ты object[i,j] освобождаеш ?
Verg (2003-09-12 13:21:00) [8]
А откуда эта scaling?