![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
О создании и удалении компонентов. [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. Диспетчер задач - не показатель. Есть такое понятие, как кэш. Сверни и разверни свое приложение и ощути разницу