Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1201361945
RU-mata
2008-01-26 18:39
2008.02.17
как спрятать свои ресурсы?


2-1201252736
destructor
2008-01-25 12:18
2008.02.17
видно пользователю image или нет?


2-1201378604
AntonUSAnoV
2008-01-26 23:16
2008.02.17
опять про полосу прокрутки...


2-1200933382
Chysti
2008-01-21 19:36
2008.02.17
Как поменять свойство Caption у всех компонентов формы


15-1200572963
Ученик
2008-01-17 15:29
2008.02.17
Действия над матрицами





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский