![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос про память. [D6, XP]
vegarulez © (2008-01-06 09:45:00)Привет всем мастерам.
Подскажите пожалуйста ответ на такой вопрос...
у меня в программе я должен обновлять рисунок кнопочек и обновляю я его вот таким кодом:
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 (выделлые жирным цветом :) ) ну типа думал очистить, чтоб память не занималась... но это не помогло...
Вопрос: Подскажите как сделать правильно? Чтобы после каждого обновления память не подъедалась. Хоть она увеличивается и не на много там килобайты... но тем не менее...
homm (2008-01-22 12:39:00) [1]> [44] vegarulez © (22.01.08 12:37)
> Хотелось бы Ваши коментарии по поводу сего услышать...
Был баг в №6. Исправили. Какие еще комментарии нужны…
vegarulez (2008-01-22 12:37:00) [2]Хотелось бы Ваши коментарии по поводу сего услышать...
vegarulez (2008-01-22 12:36:00) [3]2 ЦУП:
в блок finally это вставить нуно?
2 all:
Народ... я немного в шоке....
я понял по чему у вас не кушается - тот же примерчик скомпил на D7 и там действительно не кушается.... даже без того что ЦУП советовал. А на D6 жрётся... посылаю вам 2 экзека с 10 мс, один скомпилин под д7, один под д6. Посмотрите, что я не гоню...
д6 жрёт, д7 нет....
http://slil.ru/25385205
тока нада пометить в ту же папку, которую вы ранее скачали... а то рисунки не найдёт...
DVM (2008-01-22 11:26:00) [4]
> Что то мне тогда не совсем понятно, как ты сделал выводы
> в [36].
Взял его тестовое приложение и добавил туда сначала FastMM4 и он при завершении приложения показал утечки, кажется 32 и 36 байт, потом то же самое показал MemProf и указал мне номер строки в QForms. Дальше я разбираться не стал - оно непосредственно к делу не относится.
homm (2008-01-22 06:50:00) [5]> [40] DVM © (22.01.08 00:07)
> Утечка тем не менее наблюдается только у него. У нас ее
> нету.
Что то мне тогда не совсем понятно, как ты сделал выводы в [36].
DVM (2008-01-22 00:07:00) [6]
> ЦУП © (21.01.08 23:56) [39]
Утечка тем не менее наблюдается только у него. У нас ее нету.
ЦУП (2008-01-21 23:56:00) [7]
> vegarulez © (21.01.08 21:03) [27]
А ты добавил код, который я тебе написал?
Если нет, какого хера ты тут выкладываешь свой дебильный код?
Он тот же самый с утерей ресурсов, как и был.
DVM (2008-01-21 22:44:00) [8]
> В указаной процедуре или нет?
Нет в QForms.
homm (2008-01-21 22:41:00) [9]> [36] DVM © (21.01.08 22:22)
В указаной процедуре или нет?
DVM (2008-01-21 22:22:00) [10]А есть утечка то. Правда не зависящая от времени. На выходе не освобождаются кое-какие ресурсы.
homm (2008-01-21 22:21:00) [11]ДА, кстати, строчку
Bmp.LoadFromFile('./picture/key'+inttostr(z)+'.bmp');
Из цикла вынеси, позорно же :)
DVM (2008-01-21 22:14:00) [12]Проверил тоже у себя данный код - абсолютно никаких утечек нет. Проработал минуту при таймере 100мс - байт в байт занимаемая память осталась прежней.
> vegarulez ©
Снеси все драйверы виртуальных машин, антивирусы и др подобный софт.
homm (2008-01-21 22:14:00) [13]Вставь вот такой код, посмотри, течет.
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;
у меня не течет.
homm (2008-01-21 22:04:00) [14]> [30] vegarulez © (21.01.08 22:02)
> подскажи тогда в чём дело?
Ну я бы уже, если бы сам понимал что там у тебя. В приципе каждый раз идет ообращение к диску, было бы лучше его убрать совсем. Возможно у тебя какойнить хитрый файл монитор стоит, который отжирает…
homm (2008-01-21 22:03:00) [15]> [29] vegarulez © (21.01.08 22:00)
> у меня обновление 1 секунда,
И в чем прелесть этой муки? (60*60=3600, в 3 раза меньше чем у меня (я там на ноль ошибся)) Не проще ли вызывать обновление в сто раз чаще?
vegarulez (2008-01-21 22:02:00) [16]подскажи тогда в чём дело? нифига не понимаю...
vegarulez (2008-01-21 22:00:00) [17]у меня обновление 1 секунда, гоняется час с 4,5 мб уже 15мб вышло (
homm (2008-01-21 21:22:00) [18]> [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 21:03:00) [19]Вот сделал тестовый пример http://slil.ru/25383062
запуститите, посмотрите, что именно эта процедура кушает память.
DVM (2008-01-20 23:29:00) [20]
> vegarulez ©
Скачиваешь MemProof. Компилишь свою прогу с отладочной информацией. Запускаешь свою прогу из MemProof. Видишь список ресурсов. Чего сколько, где растет и т.д. Закрываешь прогу - видишь список оставшегося мусора. Выделяешь интересующую тебя строчку с мусором - видишь строку в исходнике, где этот мусор выделялся, но не освободился.