Форум: "Media";
Текущий архив: 2004.01.16;
Скачать: [xml.tar.bz2];
ВнизУтечка памяти при Найти похожие ветки
← →
Lev (2003-09-12 13:10) [0]Прошу помочь со следующей проблемой.
Я сделал простенький просмотрщик картинок (изображения формата 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;
...
С чем может быть связано утекание памяти и как с ним бороться?
← →
Verg (2003-09-12 13:21) [1]А откуда эта scaling ?
← →
Hooch (2003-09-12 13:28) [2]а при закрытии фоормы ты object[i,j] освобождаеш ?
← →
Hooch (2003-09-12 13:29) [3]либо в scaling косяк
← →
Sapersky (2003-09-12 14:50) [4]Создавать лучше в OnShow, уничтожать в OnHide (а не OnCreate/OnDestroy). Если, конечно, это главная форма.
← →
Lev (2003-09-15 11:07) [5]>Verg, Hooch
scaling - моя процедура, я уверен, что дело не в ней, т.к. я сам, заподозрив что-то с ней связанное, ее просто отключал (т.е. не масштабировал картинки при помещении в сетку), но никакой разницы не было - те же утечки памяти при прокрутке
>Hooch
Конечно, я освобождаю object[i,j] при закрытии, но ведь утечки не при закрытии, а при работе формы - при прокрутке
>Sapersky
Какая в данном случае разница?
← →
ZEE (2003-09-15 11:39) [6]В чем проявляются эти "утечки памяти"?
Если в том что доступной физической памяти становится меньше - то это не утечка - просто надо ж куда-то девать картинки, которые ты открываешь в просмотре.
Конечно если идет доступной памяти все меньше, а кол-во загруженных объектов не увеличивается (точнее не должно было увеличиваться) - то вот тут что-то не так...
а конкретнее - после создания и использования картинок
pct:=tpicture.create;
...
надо все-таки Free делать,
или не создавать каждый раз новые, а юзать ранее созданные...
← →
AlexT1000 (2003-09-15 14:03) [7]если у тебя D5 скачай updatePack . у меня вроде тоже такая хрень была. по идее должно помочь.
← →
Sapersky (2003-09-15 17:01) [8]Какая в данном случае разница?
Кажется, никакой :) Я это посоветовал по старой памяти - были какие-то глюки в своё время. Я полагал, что событие OnCreate возникает до создания компонентов, лежащих на форме. Сейчас специально посмотрел - до Delphi3 включительно действительно так, начиная с Delphi4 OnCreate возникает после создания всех компонентов. Так что проблем из-за этого быть не должно.
Но я всё равно пишу инициализацию в OnShow :)
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2004.01.16;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c