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

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

О создании и удалении компонентов. [D7, XP]


operator ©   (2008-02-01 12:09:00) 

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

При попытке создать, а потом удалить 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;


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


Amoeba   (2008-02-01 16:55:00) [1]


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

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

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


operator   (2008-02-01 16:21:00) [2]


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


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


{RASkov}   (2008-02-01 15:59:00) [3]

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

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


operator   (2008-02-01 14:11:00) [4]

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


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


ketmar   (2008-02-01 12:38:00) [5]

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


{RASkov}   (2008-02-01 12:33:00) [6]

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

Типа примерно так:
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;


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

> operator ©   (01.02.08 12:09)

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


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

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

С особенностями работы менеджера памяти 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 кнопок. А Вы представляете?


Palladin   (2008-02-01 12:15:00) [9]

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


clickmaker   (2008-02-01 12:15:00) [10]

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

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


Наверх

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