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

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.014 c
2-1201546095
noi
2008-01-28 21:48
2008.02.24
перевести данные из pChar в array of Byte


2-1201868796
Danco
2008-02-01 15:26
2008.02.24
форма


15-1201165540
РВА
2008-01-24 12:05
2008.02.24
Формирование xml


9-1166065606
GameDev
2006-12-14 06:06
2008.02.24
Что случилось с Animiks ?


2-1201538510
MVanya
2008-01-28 19:41
2008.02.24
вопрос про интерфейсы