Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.02.24;
Скачать: [xml.tar.bz2];

Вниз

О создании и удалении компонентов.   Найти похожие ветки 

 
operator ©   (2008-02-01 12:09) [0]

Доброго времени суток!

При попытке создать, а потом удалить 3000 кнопок на форме, по информации Диспетчера задач винды количество памяти, занимаемой программой увеличивается, то есть после запуска 2300Кб, после создания кнопок 5200Кб, а после их удаления - 3200, то есть почти одн мегабайт утечка.

работает следующий код:

var a:array [1..3000] of TButton;

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
 ProgressBar1.Max:=3000;
  for i:= 1 to 3000 do begin
  ProgressBar1.Position:=i;
       a[i]:=TButton.Create(form1);
       a[i].Parent:=form1;
       a[i].Name:="b"+inttostr(i);
       a[i].Left:=10;
       a[i].Top:=10*i+4;
       a[i].Height:=10;
       a[i].Width:=100;
       a[i].Show
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
begin
  for i:= 1 to 3000 do a[i].Free;
end;


хотелось бы узнать с чем это связано? выводит ли Диспетчер неверную информацию, или я неправильно создаю\удаляю компоненты?


 
Palladin ©   (2008-02-01 12:15) [1]

понажимай на button1 и button2 несколько раз... доложи обстановку...


 
clickmaker ©   (2008-02-01 12:15) [2]

а зачем столько?

PS. Диспетчер задач - не показатель. Есть такое понятие, как кэш. Сверни и разверни свое приложение и ощути разницу


 
Семеныч   (2008-02-01 12:22) [3]

> чем это связано?

С особенностями работы менеджера памяти Delphi. У Вас все верно, диспетчер выводит информацию тоже верно.

Мелкие замечания:

a[i]:=TButton.Create(Self);
a[i].Parent:=Self;

a[i].Left:=10; - убрать
a[i].Top:=10*i+4; - убрать
a[i].Height:=10; - убрать
a[i].Width:=100; - убрать
a[i].SetBounds - добавить вместо убранного.

a[i].Show - убрать совсем. Лишнее.

Так покультурнее будет. Хотя сути не меняет.

А теперь о главном - лично я не представляю, как человек сможет работать с формой, на которой 3000 кнопок. А Вы представляете?


 
Семеныч   (2008-02-01 12:25) [4]

> operator ©   (01.02.08 12:09)

Еще момент - если нажать на Buttton1 несколько раз (не нажимая Button2), то поимеем неслабую утечку памяти. Об этом надо подумать.


 
{RASkov} ©   (2008-02-01 12:33) [5]

> Об этом надо подумать.

Типа примерно так:
var a:array [1..3000] of TButton;

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
procedure CreateButtom;
begin
  a[i]:=TButton.Create({form1}Self);
  a[i].Parent:={form1}Self;
//   a[i].Name:="b"+inttostr(i); //По большей части ни к чему это
  a[i].Left:=10;
  a[i].Top:=10*i+4;
  a[i].Height:=10;
  a[i].Width:=100;
//   a[i].Show //Уже по умолчанию "виднА"
end;
begin
 ProgressBar1.Max:=3000;
 for i:= {1}Low(a) to {3000}High(a) do begin
  ProgressBar1.Position:=i;
  if not Assigned(a[i]) then CreateButtom;
 end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
begin
 for i:= {1}Low(a) to {3000}High(a) do begin
  a[i].Free;
  a[i]:=nil;
 end;
end;


 
ketmar ©   (2008-02-01 12:38) [6]

Удалено модератором


 
operator ©   (2008-02-01 14:11) [7]

Вообще данный пример - лишь тренировка на тему создания и удаления компонентов. Просто хотелось бы узнать, почему при создании, а затем удалении компонента программа занимает больше памяти. 3000 кнопок - это так, для наглядности.

Еще интересно, что при такой реализации:

procedure TForm1.Button1Click(Sender: TObject);
var a:tbutton;
   i:integer;
const
   c:integer=3000;
begin
   Label3.Caption:=".......";
   Label3.Repaint;
   for i:= 0 to c do begin
       a:=tbutton.Create(self);
       a.Parent:=self;
       a.SetBounds(10,10,20,50);
       a.Free;
   end;
   Label3.Caption:="ok";
end;


диспетчер задач изменения памяти практически не показывает.


 
{RASkov} ©   (2008-02-01 15:59) [8]

> [7] operator ©   (01.02.08 14:11)
> диспетчер задач изменения памяти практически не показывает.

Привязался ты к этому диспетчеру :(
Для отслеживания процесса работы процесса) есть другие, специализированные, инструменты.
А диспетчер, он не для разработчиков. Он для юзверей :)


 
operator ©   (2008-02-01 16:21) [9]


> Для отслеживания процесса работы процесса) есть другие,
> специализированные, инструменты.
> А диспетчер, он не для разработчиков. Он для юзверей :)


Посоветуй пожалуйста какой-нибудь подоюный инструмент для мониторинга объема памяти, которое использует приложение для работы?


 
Amoeba ©   (2008-02-01 16:55) [10]


> operator ©   (01.02.08 16:21) [9]
>
>
> > Для отслеживания процесса работы процесса) есть другие,
>
> > специализированные, инструменты.
> > А диспетчер, он не для разработчиков. Он для юзверей :
> )
>
>
> Посоветуй пожалуйста какой-нибудь подоюный инструмент для
> мониторинга объема памяти, которое использует приложение
> для работы?

Не объем памяти надо мониторить, а утечки памяти отлавливать.

http://www.delphikingdom.com/tower/index.asp?CategoryID=6



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

Форум: "Начинающим";
Текущий архив: 2008.02.24;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.041 c
9-1165141128
DRUGOI ilya
2006-12-03 13:18
2008.02.24
человек и ODE


2-1201861064
mrFreeman2007
2008-02-01 13:17
2008.02.24
Завершение работы


15-1200988460
shlst
2008-01-22 10:54
2008.02.24
Потерянный доступ!


2-1201902057
школьник
2008-02-02 00:40
2008.02.24
не получается запись в ИБ6


2-1201788603
Бо
2008-01-31 17:10
2008.02.24
Подскажите





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский