Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос про память. [D6, XP]


Страницы:   1 2 3

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. Видишь список ресурсов. Чего сколько, где растет и т.д. Закрываешь прогу - видишь список оставшегося мусора. Выделяешь интересующую тебя строчку с мусором - видишь строку в исходнике, где этот мусор выделялся, но не освободился.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо