Форум: "Основная";
Текущий архив: 2005.02.06;
Скачать: [xml.tar.bz2];
ВнизНе освобождается память при завершении потока Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.038 c