Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Потоки кушают оперативку. + System Error 5 [D7, WinXP]


tytus ©   (2007-06-16 11:27:00) 

Доброго дня мастера.
Имеется класс:
TPPS=Class(TThread)
protected
 procedure StartPostProcessing;  
 procedure Execute;override;
public
 Constructor Create(Мои переменные);
 Desctructor Destroy;override;

Construcor TPPS.Create(...);
begin
...
inherited Create(true);//пока что спит...
end;

Destructor TPPS.Destroy;
begin
чистим переменные
...
inherited Destroy;
end;

в процедуре потока пишу:
procedure Execute;
begin
 FreeOnTerminate:=true;
 StartPostProcessing;
end;

Процессов может быть несколько.(к прим. - 9)
В главном юните описан тип:
 PPPS=^ATPPS;
 ATPPS=record
   APPS:TPPS;
 end;
PPSData:PPPS;
для этого создан список процессов:
PPSList:TThreadList;

в тексте программы наполняю список потоков:
         New(PPSData);
         PPSData^.APPS:=TPPS.Create(Мои параметры);
         PPSData^.APPS.Priority:=tpNormal;
         PPSData^.APPS.OnTerminate:=ThreadDone;..*
         PPSList.Add(PPSData);
* - процедура в которой подсчитывается кол-во завершенных потоков.
а вот так потоки стартуют:
     with PPSList.LockList do
     for n:=0 to Count-1 do
     begin
       PPPS(Items[n])^.APPS.Resume;
     end;

procedure ThreadDOne;
begin
inc(DoneCount);
   with PPSList.LockList do
   if DoneCount=Count then
   begin
      ....
   end;
   PPSList.UnlockList;
end;
а вот так очищаю список потоков:
//вот тут-то и появляется ошибка (System Error 5 отказано в доступе)
procedure ClearThreadList;
 with PPSList.LockList do
 begin
   for i:=0 to Count-1 do
   begin
     Dispose(PPPS(Items[i]));
   end;
   Clear;
 end;
 PPSList.UnlockList;
end;
Причем ошибка появляется не сразу, а после нескольких раз
отрабатывания потоков. Вот за 12 часов работы программы (потоку запускаются каждый час) сожралось 30МБ оперативки (смотрел по диспетчеру задач).
Вот жду появления ошибки....
В чам тут дело, подскажите плиз..!!!


tytus   (2007-06-18 09:27:00) [1]

>SlymRO ©   (18.06.07 08:29) [7]
Количество потоков после отработки программы остается прежним.
Кол-во процессов увеличивается на 1 если запущена моя прога (вроде бы так и должно быть...-)
Кол-во дескрипторов меняется и без моей проги, поэтому не обращаю внимания.

>MBo ©   (18.06.07 09:05) [8]
Смысл... так привык делать при работе со списками (TList) когда в записи много разнотипных переменных (удобно потом сортировать и т.п.)
Но если мне нужен единственный указатель на поток, то, наверное, нужно отказаться от такого типа... Счаз попробую переписать.
>All
А вообще при создании 9-ти потоков,  и последующем их освобождении, память сжырается в размере 7-ми метров... Хотя ошибка исчезла. Вот за выходные ниразу не заглючило, хотя сожрало 55 метров. (Прога работает каждый час, следовательно должно было сожраться минимум 24*7=168 метров, а сожралось по диспетчеру задач - 55... И как тут бороться?)

PS/
>Loginov Dmitry ©   (16.06.07 15:33) [5]
Переделал, но проблема отъедания памяти не решилась... Но зато правильно, согласен.


sniknik   (2007-06-18 09:13:00) [2]

больше интересно зачем освобождение памяти потока вместо его завершения (Terminate), и какой смысл выставлять автоосвобождение (FreeOnTerminate:=true;) если нормального завершения все одно нет.

естественно будут отказы в доступе, в случае если память уже освобождена а код в ней еще выполняется(/адресация идет), она же уже не принадлежит программе.


MBo   (2007-06-18 09:05:00) [3]

PPPS=^ATPPS;
ATPPS=record
  APPS:TPPS;
end;

В чем смысл введения этого типа и работы с ручным динамическим выделением памяти?


SlymRO   (2007-06-18 08:29:00) [4]

Кроме памяти TaskMan может показывать и количество потоков и хендлов и прочей лабуды, что они показывают?


Kolan   (2007-06-16 15:35:00) [5]

Так а проверить где она отедается?
MemProof если D7 и ниже.
ReportMemoryLeaksOnShutDow := True;если BDS и выше


Loginov Dmitry   (2007-06-16 15:33:00) [6]

> Ничего не получилось.
> Память отъедается


Ну так потоки может создаются, причем в большом количестве, но не завершаются.

И TThreadList по-нормальному следует так использовать:
with TThreadList.LockList do
try
 {code}
finally
 TThreadList.UnlockList;
end;

иначе произойдет одна-единственная ошибка в рамках дополнительного потока - и нормально работать со списком не сможешь - все остальные потоки просто зависнут, пытаясь начать работу со списком.


tytus   (2007-06-16 15:24:00) [7]

>
Ничего не получилось.
Память отъедается, ошибки пока нет, но скоро появится...


Kolan   (2007-06-16 13:53:00) [8]

> а затем inherited , или наоборот?

Вначале.


tytus   (2007-06-16 13:28:00) [9]

>Loginov Dmitry ©   (16.06.07 13:19) [1]
Спасибо, счаз попробую!
и исче вопрос - в деструкторе, вначале чистить переменные,
а затем inherited , или наоборот?


Loginov Dmitry   (2007-06-16 13:19:00) [10]

FreeOnTerminate:=true;
вынеси в конструктор потока


Наверх

Титульная страница Поиск, карта сайта Написать письмо