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

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

Как ликвидировать выделенную память под компонент. [D7, WinXP]


Grol ©   (2005-10-31 23:02:00) 

Не знаю....понятен ли Вам вопрос, но суть следующая: кидаю на форму MEMO1, LISTBOX1, STRINGGRID1 и Button1. В процедуре Button1 пишу следующее:


procedure TForm1.Button1Click(Sender: TObject);
var
  i,j:integer;
begin
Memo1.Clear;
ListBox1.Clear;
for i:=0 to StringGrid1.ColCount-1 do
 for j:=0 to StringGrid1.RowCount-1 do
     StringGrid1.Cells[i,j]:='';
StringGrid1.ColCount:=1;
StringGrid1.RowCount:=1;
end;


Компилирую. Залезаю в диспетчер задач-->смотрю сколько прога занимает в памяти 4МБайт. Потом заполняю MEMO1, LISTBOX1, STRINGGRID1 какими-нибудь данными. Ну и вот заполнил, данными...смотрю через диспетчер задач сколько теперь весит программа в памяти, ага...например 30 МБайт.
Жму на Button1 и снова смотрю в диспетчер задач по прежнему 30МБайт. Так вот вопрос такой, как память, которая была выделенна под определенный компонент, прсто убить...:))
Спасибо заранее за ответы.


Amoeba   (2005-11-01 10:45:00) [1]


> смотрю через диспетчер задач сколько теперь весит программа
> в памяти, ага...например 30 МБайт.
> Жму на Button1 и снова смотрю в диспетчер задач по прежнему
> 30МБайт. Так вот вопрос такой, как память, которая была
> выделенна под определенный компонент, прсто убить...:))

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


sniknik   (2005-10-31 23:42:00) [2]

> А если у него 1Гб оперативки и отключен своп? :)
тогда пусть в дополнение к думу запустит 1С восьмерку... вот что память жрет, ни одной игрухе и не снилось. ;)

Grol ©   (31.10.05 23:02)
операции с памятью довольно длительны, поэтому и не делаются без необходимости. тем более если ты раз затребовал 30мг, то где гарантия что снова не затребуеш? сразу после освобождения, как раз в тот момент когда система ранее затребованную заберет. и будет она память только туда сюда гонять, выдавать, отбирать, выдавать, отбирать ...  вся только твою прогу обслуживать.

for i:=0 to StringGrid1.ColCount-1 do
for j:=0 to StringGrid1.RowCount-1 do
    StringGrid1.Cells[i,j]:='';
вот это лишнее, пожалуй.

> Так вот вопрос такой, как память, которая была выделенна под определенный компонент, прсто убить...:))
а вот это просто вредное... т.к. даже "убив" компоненты ты не заставиш систему забрать "лишнюю" (как тебе кажется) память выделенную твоей проге.

зато можеш "заставить" другим способом, например нажав на кнопку "свернуть" в правом верхнем углу рядом с крестиком... в принципе тоже самое делается вызовом одной API функции (SetProcessWorkingSetSize) только делать этого не надо...


Eraser   (2005-10-31 23:33:00) [3]


> Zeqfreed ©   (31.10.05 23:15) [2]

А смысл тогда срезать working size? Это только замедлит последующую работу программы, если прийдётся снова заполнять данными эти MEMO1, LISTBOX1, STRINGGRID1.


Zeqfreed   (2005-10-31 23:15:00) [4]

Eraser ©   (31.10.05 23:09) [1]
А если у него 1Гб оперативки и отключен своп? :)


Eraser   (2005-10-31 23:09:00) [5]


> Grol ©   (31.10.05 23:02)

Попробуй после нажатия Button1, запустить Doom3 потом закрыть его, и глянь сколько будет занимать прога ;-)

Способы принудительно уменьшить размер есть, но лучше когда это делает система.


Наверх

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