![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не освобождается память при завершении потока [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]
> Подскажите, как можно завершить поток, и освободить занятую
> им память?
реализовав безошибочныйалгоритм