Главная страница
    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.044 c
4-1183798694
Cj
2007-07-07 12:58
2008.02.24
USERProcessHandleQuota, GDIProcessHandleQuota ???


2-1200477368
Washington
2008-01-16 12:56
2008.02.24
Панель задач - трей


2-1201436104
kast
2008-01-27 15:15
2008.02.24
Поиск нескольких позиций в бд


15-1201252151
tolyan
2008-01-25 12:09
2008.02.24
загрдиск


3-1192011059
Alex
2007-10-10 14:10
2008.02.24
проблема в передаче выборки из БД в Rave





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