Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.15;
Скачать: CL | DM;

Вниз

Потоки кушают оперативку. + System Error 5   Найти похожие ветки 

 
tytus ©   (2007-06-16 11:27) [0]

Доброго дня мастера.
Имеется класс:
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МБ оперативки (смотрел по диспетчеру задач).
Вот жду появления ошибки....
В чам тут дело, подскажите плиз..!!!


 
Loginov Dmitry ©   (2007-06-16 13:19) [1]

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


 
tytus ©   (2007-06-16 13:28) [2]

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


 
Kolan ©   (2007-06-16 13:53) [3]

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

Вначале.


 
tytus ©   (2007-06-16 15:24) [4]

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


 
Loginov Dmitry ©   (2007-06-16 15:33) [5]

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


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

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

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


 
Kolan ©   (2007-06-16 15:35) [6]

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


 
SlymRO ©   (2007-06-18 08:29) [7]

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


 
MBo ©   (2007-06-18 09:05) [8]

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

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


 
sniknik ©   (2007-06-18 09:13) [9]

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

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


 
tytus ©   (2007-06-18 09:27) [10]

>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]
Переделал, но проблема отъедания памяти не решилась... Но зато правильно, согласен.



Страницы: 1 вся ветка

Текущий архив: 2007.07.15;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.018 c
15-1182185234
Грициан
2007-06-18 20:47
2007.07.15
Доведем bbc до истерики


15-1182101637
koha
2007-06-17 21:33
2007.07.15
Приглашают на работу, как быть?


2-1182437480
Delon
2007-06-21 18:51
2007.07.15
Добрый вечер уважаемые мастера! Прошу помочь разобраться.


2-1182168612
Krants
2007-06-18 16:10
2007.07.15
иэроглифы при копировании из буфера


15-1181906747
Predfer
2007-06-15 15:25
2007.07.15
Компьютер не работает!