Главная страница
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.046 c
1-1106293071
newver
2005-01-21 10:37
2005.02.06
JPEG Error #42


4-1103257108
DelphiN!
2004-12-17 07:18
2005.02.06
Как узнать путь к процессу ?


14-1103740532
Alexander Panov
2004-12-22 21:35
2005.02.06
Выборы в Украине. Противостояние. (Продолжение 5 - шестая ветка)


3-1104826284
sergg
2005-01-04 11:11
2005.02.06
Очистка таблицы ACCESS 2000


9-1098893371
Falcon(TFSoft)
2004-10-27 20:09
2005.02.06
Создание объектов