Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.17;
Скачать: CL | DM;

Вниз

Вопрос про память.   Найти похожие ветки 

 
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]

Утечка тем не менее наблюдается только у него. У нас ее нету.



Страницы: 1 2 вся ветка

Текущий архив: 2008.02.17;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.02 c
15-1200327179
Ломброзо
2008-01-14 19:12
2008.02.17
HTML DOS Layout


15-1200298824
alexeis
2008-01-14 11:20
2008.02.17
не соответствие клавиш в DOSe


6-1180443920
Chaser
2007-05-29 17:05
2008.02.17
Путь к папке "Program Files" на удаленном компьютере


8-1173970224
Insert
2007-03-15 17:50
2008.02.17
Обработка потока видео!


2-1200923476
zeroed
2008-01-21 16:51
2008.02.17
Отображение анимационных гифов