Форум: "Начинающим";
Текущий архив: 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.044 c