Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1106561113
slim
2005-01-24 13:05
2005.02.06
помогите перевести на делфи


3-1104994216
korvin
2005-01-06 09:50
2005.02.06
Индексы пакостят?


3-1105360995
syte_ser78
2005-01-10 15:43
2005.02.06
Сохранение изменений в таблице


14-1105962386
ПЛОВ
2005-01-17 14:46
2005.02.06
Яндекс че-то в полном дауне :)


1-1106307654
Separator
2005-01-21 14:40
2005.02.06
RAS





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский