Форум: "Начинающим";
Текущий архив: 2008.02.17;
Скачать: [xml.tar.bz2];
ВнизВопрос про память. Найти похожие ветки
← →
vegarulez © (2008-01-06 09:45) [0]Привет всем мастерам.
Подскажите пожалуйста ответ на такой вопрос...
у меня в программе я должен обновлять рисунок кнопочек и обновляю я его вот таким кодом:
var
i,z:Integer;
begin
randomize;
z:=random(rnd_btn);
Bmp := TBitmap.Create;
for i:=0 to FormMain.ComponentCount-1 do
if FormMain.Components[i] is TButton then
with (FormMain.Components[i] as TButton) do
if pos("BT_",FormMain.Components[i].Name)=0 then
Begin
Bmp.LoadFromFile("./picture/key"+inttostr(z)+".bmp");
Bitmap.FreeImage;
Bitmap.FreePixmap;
Bitmap.Width:=Width;
Bitmap.Height:=Height;
Bitmap.Canvas.StretchDraw(ClientRect,Bmp);
End;
Bmp.Free;
end;
Так вот... перехожу собственно к вопросу... при таком подходе я заметил, что после каждого обновления рисунка кнопочек память выделяемая под программу увеличивается.
Я добавил в код FreeImage, FreePixmap (выделлые жирным цветом :) ) ну типа думал очистить, чтоб память не занималась... но это не помогло...
Вопрос: Подскажите как сделать правильно? Чтобы после каждого обновления память не подъедалась. Хоть она увеличивается и не на много там килобайты... но тем не менее...
← →
@!!ex © (2008-01-06 10:55) [1]
var
i,z:Integer;
begin
randomize;
z:=random(rnd_btn);
Bmp := TBitmap.Create;
try
for i:=0 to FormMain.ComponentCount-1 do
if FormMain.Components[i] is TButton then
with (FormMain.Components[i] as TButton) do
if pos("BT_",FormMain.Components[i].Name)=0 then
Begin
Bmp.LoadFromFile("./picture/key"+inttostr(z)+".bmp");
Bitmap.Width:=Width;
Bitmap.Height:=Height;
Bitmap.Canvas.StretchDraw(ClientRect,Bmp);
End;
finally
Bmp.Free;
end;
end;
← →
vegarulez © (2008-01-20 22:01) [2]
var
i,z:Integer;
begin
randomize;
z:=random(rnd_btn);
Bmp := TBitmap.Create;
try
for i:=0 to FormMain.ComponentCount-1 do
if FormMain.Components[i] is TButton then
with (FormMain.Components[i] as TButton) do
BEGIN
if pos("BT_",FormMain.Components[i].Name)=0 then
Begin
Bmp.LoadFromFile("./picture/key"+inttostr(z)+".bmp");
Bitmap.Width:=Width;
Bitmap.Height:=Height;
Bitmap.Canvas.StretchDraw(ClientRect,Bmp);
End;
END;
finally
Bmp.Free;
end;
end;
Да но всё равно каждый раз память подъедается... и назад возращаться не хотит... т.е. я так понимаю... что типа на холст наверно наносится изображение и занимает память не выгружая из памяти старый холст....
вопрос остаётся в силе...
нид Хелп...
← →
homm © (2008-01-20 22:06) [3]Еще одну строчку заголоска функии прихвати в цитировании. А что есть Bitmap ?
← →
vegarulez © (2008-01-20 22:13) [4]Прихватил... только, что это дало для понимания вопроса?
procedure TFormMain.BT_Picture();
var
i,z:Integer;
begin
randomize;
z:=random(rnd_btn);
Bmp := TBitmap.Create;
try
for i:=0 to FormMain.ComponentCount-1 do
if FormMain.Components[i] is TButton then
with (FormMain.Components[i] as TButton) do
BEGIN
if pos("BT_",FormMain.Components[i].Name)=0 then
Begin
Bmp.LoadFromFile("./picture/key"+inttostr(z)+".bmp");
Bitmap.Width:=Width;
Bitmap.Height:=Height;
Bitmap.Canvas.StretchDraw(ClientRect,Bmp);
End;
END;
finally
Bmp.Free;
end;
end;
← →
DVM © (2008-01-20 22:17) [5]
> vegarulez ©
> Да но всё равно каждый раз память подъедается... и назад
> возращаться не хотит...
Как узнал?
← →
homm © (2008-01-20 22:20) [6]> [4] vegarulez © (20.01.08 22:13)
> Прихватил... только, что это дало для понимания вопроса?
То, что ты выполняешь этот код не по какому то действию, а уже совершив какие-то действия в обрабочтике события. Так что утечка скорее всего не здесь.
← →
vegarulez © (2008-01-20 22:24) [7]млин ну я по шагам смотрю... по F8... когда переходит на эту процедуру - наней подъедается... смотрю через диспетчер задач... выделение памяти процессу
← →
DVM © (2008-01-20 22:27) [8]
> смотрю через диспетчер задач...
Диспетчер задач он не удобен для этих целей. Возьми либо FastMM4, а еще лучше MemProof и погляди что и ГДЕ у тебя текет.
← →
DVM © (2008-01-20 22:27) [9]А в приведенном коде ошибок нет.
← →
homm © (2008-01-20 22:29) [10]> [7] vegarulez © (20.01.08 22:24)
Не так смотрят. Во первых нет такого столбца в дисптчере, ни «выделение памяти процессу», ни «выделенная памяти процессу». По крайней мере в русской ХР. Смотреть нужно на «объем виртуальной памяти». Причем смотреть явно не под олтлачиком, и прогоняя тестируемую процедуру несколько раз, т.к. после первого раза память моддет выделится под нужды системы по обслуживанию приложения, а не под само приложение.
← →
vegarulez © (2008-01-20 22:30) [11]да я понимаю что ошибок нет... просто не понимаю... как делфи с графикой кнопок работает... каким образом он рисует холст... типа кранит в памяти прежний помещая повер него новый? или затирает его? но почему тогда подъедается память, если затирает его новым.... вот такие вопросики...
спасибо за прожки сечас поисчу их в инете... мож у тя ссылки есть на них?
← →
homm © (2008-01-20 22:32) [12]> [11] vegarulez © (20.01.08 22:30)
> но почему тогда подъедается память
Пока только по тому, что так утверждаешь ты…
← →
vegarulez © (2008-01-20 22:33) [13]homm © (20.01.08 22:29) [10] прогоняю много раз саму программу даже без отладчика гтовый экзек скомпилиный... тыкаю на кнопку которая эту процедуру юзает...
← →
homm © (2008-01-20 22:36) [14]> [13] vegarulez © (20.01.08 22:33)
> прогоняю много раз саму программу
Че, какую программу? Ты же утверждаешь, что в этом участке у тебя течет, этот участок и прогоняй.
← →
DVM © (2008-01-20 22:38) [15]
> vegarulez ©
Кстати, а что такое все же Bitmap там?
← →
vegarulez © (2008-01-20 22:43) [16]DVM © (20.01.08 22:38) [15]
CLX о чём то говорит?
← →
DVM © (2008-01-20 22:46) [17]
> CLX о чём то говорит?
Конечно. Правда не использовал и не использую.
← →
homm © (2008-01-20 22:49) [18]> [16] vegarulez © (20.01.08 22:43)
> CLX о чём то говорит?
Еврей?
← →
DVM © (2008-01-20 22:49) [19]
> vegarulez © (20.01.08 22:43) [16]
Ты б сразу сказл, что у тебя форма из QForms
← →
homm © (2008-01-20 22:51) [20]> [19] DVM © (20.01.08 22:49)
> Ты б сразу сказл, что у тебя форма из QForms
не переживай, еще более нужные подробности мы узнам не раньше 60-го поста %)
← →
vegarulez © (2008-01-20 23:01) [21]homm © (20.01.08 22:51) [20]
Ну какие именно подробности тебя интересуют? я же уже всё что требуется написал. процедуру которая кушает уже привёл.
← →
homm © (2008-01-20 23:08) [22]> [21] vegarulez © (20.01.08 23:01)
> Ну какие именно подробности тебя интересуют? я же уже всё
> что требуется написал.
Ага?
Что такое bitmap — раз.
Ты не так тестировал (или не верно написал, но не написал опровержения) — два.
в [13] ты написал «тыкаю на кнопку которая эту процедуру юзает...», а я тебе сказал, что «утечка скорее всего не здесь.», т.е. не в этой процедуре. Код процедуры нажатия на кнопку ты не привел — три.
Нужно читать то, что умные люди говорят, и отвечать на вопросы, которые они задают. Отвечать не вопросом на вопрос. Ку?
← →
vegarulez © (2008-01-20 23:20) [23]1. Bitmap свойство кнопки аналогичное picture в VCL...
2. этого я так и не понял...
3. Какая разница какая там процедура - тупо создал пустую кнопку и на неё завел одну эту процедуру... её вызов...
Begin
BT_Picture();
End;
На таймер тоже ставил чтоб посомтреть... так что утечка в ней происходит...
← →
homm © (2008-01-20 23:26) [24]> [23] vegarulez © (20.01.08 23:20)
> 3. Какая разница какая там процедура - тупо создал пустую
> кнопку и на неё завел одну эту процедуру... её
Дак какая разница, или все же приведенная процедура? Еврей, блин.
← →
ЦУП © (2008-01-20 23:28) [25]
> vegarulez © (06.01.08 09:45)
Добавь код:Bmp.Dormant;
Bmp.FreeImage;
...
Bmp.Free;
← →
DVM © (2008-01-20 23:29) [26]
> vegarulez ©
Скачиваешь MemProof. Компилишь свою прогу с отладочной информацией. Запускаешь свою прогу из MemProof. Видишь список ресурсов. Чего сколько, где растет и т.д. Закрываешь прогу - видишь список оставшегося мусора. Выделяешь интересующую тебя строчку с мусором - видишь строку в исходнике, где этот мусор выделялся, но не освободился.
← →
vegarulez © (2008-01-21 21:03) [27]Вот сделал тестовый пример http://slil.ru/25383062
запуститите, посмотрите, что именно эта процедура кушает память.
← →
homm © (2008-01-21 21:22) [28]> [27] vegarulez © (21.01.08 21:03)
> Вот сделал тестовый пример http://slil.ru/25383062
Отлично! Это совсем другой разговор.
Итак, мои действия:
Я установил таймер не на секунду, а на 10мс., засек кушаемы размер, было 5328кб, отошел на 2 минуты (2х60х100=120 000 обновлений за это время), венулся, посмотрел портебление памяти, стало 5304кб. Вывод: [12] все еще в силе.
← →
vegarulez © (2008-01-21 22:00) [29]у меня обновление 1 секунда, гоняется час с 4,5 мб уже 15мб вышло (
← →
vegarulez © (2008-01-21 22:02) [30]подскажи тогда в чём дело? нифига не понимаю...
← →
homm © (2008-01-21 22:03) [31]> [29] vegarulez © (21.01.08 22:00)
> у меня обновление 1 секунда,
И в чем прелесть этой муки? (60*60=3600, в 3 раза меньше чем у меня (я там на ноль ошибся)) Не проще ли вызывать обновление в сто раз чаще?
← →
homm © (2008-01-21 22:04) [32]> [30] vegarulez © (21.01.08 22:02)
> подскажи тогда в чём дело?
Ну я бы уже, если бы сам понимал что там у тебя. В приципе каждый раз идет ообращение к диску, было бы лучше его убрать совсем. Возможно у тебя какойнить хитрый файл монитор стоит, который отжирает…
← →
homm © (2008-01-21 22:14) [33]Вставь вот такой код, посмотри, течет.
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
i := 0;
while not Application.Terminated do begin
inc(i);
label1.Caption := IntToStr(i);
Timer1Timer(Sender);
Application.ProcessMessages;
end;
end;
у меня не течет.
← →
DVM © (2008-01-21 22:14) [34]Проверил тоже у себя данный код - абсолютно никаких утечек нет. Проработал минуту при таймере 100мс - байт в байт занимаемая память осталась прежней.
> vegarulez ©
Снеси все драйверы виртуальных машин, антивирусы и др подобный софт.
← →
homm © (2008-01-21 22:21) [35]ДА, кстати, строчку
Bmp.LoadFromFile("./picture/key"+inttostr(z)+".bmp");
Из цикла вынеси, позорно же :)
← →
DVM © (2008-01-21 22:22) [36]А есть утечка то. Правда не зависящая от времени. На выходе не освобождаются кое-какие ресурсы.
← →
homm © (2008-01-21 22:41) [37]> [36] DVM © (21.01.08 22:22)
В указаной процедуре или нет?
← →
DVM © (2008-01-21 22:44) [38]
> В указаной процедуре или нет?
Нет в QForms.
← →
ЦУП © (2008-01-21 23:56) [39]
> vegarulez © (21.01.08 21:03) [27]
А ты добавил код, который я тебе написал?
Если нет, какого хера ты тут выкладываешь свой дебильный код?
Он тот же самый с утерей ресурсов, как и был.
← →
DVM © (2008-01-22 00:07) [40]
> ЦУП © (21.01.08 23:56) [39]
Утечка тем не менее наблюдается только у него. У нас ее нету.
← →
homm © (2008-01-22 06:50) [41]> [40] DVM © (22.01.08 00:07)
> Утечка тем не менее наблюдается только у него. У нас ее
> нету.
Что то мне тогда не совсем понятно, как ты сделал выводы в [36].
← →
DVM © (2008-01-22 11:26) [42]
> Что то мне тогда не совсем понятно, как ты сделал выводы
> в [36].
Взял его тестовое приложение и добавил туда сначала FastMM4 и он при завершении приложения показал утечки, кажется 32 и 36 байт, потом то же самое показал MemProf и указал мне номер строки в QForms. Дальше я разбираться не стал - оно непосредственно к делу не относится.
← →
vegarulez © (2008-01-22 12:36) [43]2 ЦУП:
в блок finally это вставить нуно?
2 all:
Народ... я немного в шоке....
я понял по чему у вас не кушается - тот же примерчик скомпил на D7 и там действительно не кушается.... даже без того что ЦУП советовал. А на D6 жрётся... посылаю вам 2 экзека с 10 мс, один скомпилин под д7, один под д6. Посмотрите, что я не гоню...
д6 жрёт, д7 нет....
http://slil.ru/25385205
тока нада пометить в ту же папку, которую вы ранее скачали... а то рисунки не найдёт...
← →
vegarulez © (2008-01-22 12:37) [44]Хотелось бы Ваши коментарии по поводу сего услышать...
← →
homm © (2008-01-22 12:39) [45]> [44] vegarulez © (22.01.08 12:37)
> Хотелось бы Ваши коментарии по поводу сего услышать...
Был баг в №6. Исправили. Какие еще комментарии нужны…
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.02.17;
Скачать: [xml.tar.bz2];
Память: 0.57 MB
Время: 0.101 c