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

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

Не освобождается память при завершении потока [D7, Win2k, WinXP]


pavel_guzhanov ©   (2005-01-24 13:17:00) 

Я сделал программу, которая по сети опрашивает компьютеры, на предмет установленного железа. Программа работает через WMI. Компьютеры опрашиваются в большом цикле, который выполняется в отдельном потоке. При опросе программа пожирает огромное количество памяти (при опросе примерно 170-200 компьютеров процесс занимает в памяти 230-250 Mbyte) Сколько я не пытался, уменьшить эти цифры не получается. Но это не очень строашно, плохо то, что после окончания опроса, поток, в котором опрос происходит, должен убиваться (использую FreOnTerminate), и должна освободиться вся занимаемая им память. Но память не освобождается, и при повторном запуске опроса занимаемая память продолжает расти.
Подскажите, как можно завершить поток, и освободить занятую им память?


pavel_guzhanov   (2005-01-24 14:34:00) [1]

Спасибо за помощь!!!!


Digitman   (2005-01-24 14:28:00) [2]


> что такое 'TO'


идентификатор некоего класса


pavel_guzhanov   (2005-01-24 14:22:00) [3]


> o := TO.create;

Взможно, я не догоняю, но что такое 'TO'?


Digitman   (2005-01-24 14:16:00) [4]

procedure TMyThread.Create(..);
begin
..
 //выделение ресурсов при конструировании
..
end;

procedure TMyThread.Destroy;
begin
..
 //освобождение соотв.ресурсов, если они были успешно выделены при конструировании
..
end;

procedure TMyThread.Execute;
begin
//выделить некие ресурсы (1)
try
while not Terminated do
 begin
  //что-то еще, возможно включающее выделение иных ресурсов (2)
 end;
finally
 //освобождение ресурсов (1) и (2)
end;


Digitman   (2005-01-24 14:10:00) [5]


> А что, я не прав?


нет, не прав.
метод Terminate просто взводит флаг Terminated.
и процедура Execute(), если она заинтересована в немедленной реакции на факт взведения этого флага, обязана как можно чаще считывать его состояние, и при обнаружении True освобождать все те ресурсы, которые были ей заняты в ходе выполнения


Erik1   (2005-01-24 14:07:00) [6]

to Eraser
Стандартная ошибка, надо так:
o := TO.create;
try
o.MyWork; //вобщем чтото.
finaly
o.free;
end;


Style   (2005-01-24 13:58:00) [7]


> Мне кажется, прекращается выполнение потока. А что, я не
> прав?


Но память занятая под объект не освобождается..

Поставь FreeOnTerminate = true,  и будет тебе счастье!


pavel_guzhanov   (2005-01-24 13:51:00) [8]


> а ты вообще-то в курсе, что происходит в рез-те исполнения
> метода TThread.Terminate

Мне кажется, прекращается выполнение потока. А что, я не прав?


Eraser   (2005-01-24 13:48:00) [9]

pavel_guzhanov
При создании каких-либо объекто, не забывай их освобождать (Free).
Используй такую конструкцию (в самом общем виде):
try
 o:=TO.create;
finaly
 o.free;
end;
Можно конечно "искусственно" уничтожить объект-поток (обёртку над системным потоком) (MyThread.free), но в этом случае уничтожаться ТОЛЬКО поля этого объекта, а различные переменные остануться.
Короче лучше всё ещё раз проверь на предмет FREE.


Digitman   (2005-01-24 13:37:00) [10]


> Разве после того как у потока происходит Terminate не уничтожается
> все, что этим потоком создано?


а ты вообще-то в курсе, что происходит в рез-те исполнения метода TThread.Terminate


Smithson   (2005-01-24 13:36:00) [11]

Нет. Все уничтожается после завершения процесса.
Когда поток завершается, то он сам должен все за собой почистить. Ну или уведомить штатного чистильщика программы, что именно надо чистить. А если его просто убивают (что делает TerminateThread), то он и мяу сказать не успевает, не то что ресурсы очистить.


pavel_guzhanov   (2005-01-24 13:31:00) [12]


> реализовав безошибочный алгоритм

C этим я согласен, но вот какой вопрос: Разве после того как у потока происходит Terminate не уничтожается все, что этим потоком создано?


Digitman   (2005-01-24 13:23:00) [13]


> Подскажите, как можно завершить поток, и освободить занятую
> им память?


реализовав безошибочныйалгоритм


Наверх

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