Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.06;
Скачать: CL | DM;

Вниз

Не освобождается память при завершении потока   Найти похожие ветки 

 
pavel_guzhanov   (2005-01-24 13:17) [0]

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


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


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


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


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


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

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


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

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


 
Digitman ©   (2005-01-24 13:37) [4]


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


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


 
Eraser ©   (2005-01-24 13:48) [5]

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


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


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

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


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


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


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

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


 
Erik1 ©   (2005-01-24 14:07) [8]

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


 
Digitman ©   (2005-01-24 14:10) [9]


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


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


 
Digitman ©   (2005-01-24 14:16) [10]

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;


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


> o := TO.create;

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


 
Digitman ©   (2005-01-24 14:28) [12]


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


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


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

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



Страницы: 1 вся ветка

Текущий архив: 2005.02.06;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.029 c
14-1105972475
Cosinus
2005-01-17 17:34
2005.02.06
Хм... Время включения заставки в NT-системах...


11-1089191567
Vladimyr
2004-07-07 13:12
2005.02.06
Эти странные батоны...


3-1105347168
Orc
2005-01-10 11:52
2005.02.06
Список серверов SQL в сети


14-1105886309
Fenik
2005-01-16 17:38
2005.02.06
Откуда на Титане метан?


14-1105981281
Никита
2005-01-17 20:01
2005.02.06
Нужен набор компонентов которые косят под XP