Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.07.15;
Скачать: [xml.tar.bz2];

Вниз

Потоки кушают оперативку. + 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.04 c
15-1181997704
Val
2007-06-16 16:41
2007.07.15
Вопрос по C#


3-1176371776
Анна
2007-04-12 13:56
2007.07.15
Как обработать в приложении разрыв connect-a


15-1181874194
Slider007
2007-06-15 06:23
2007.07.15
С днем рождения ! 15 июня 2007 пятница


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


15-1181819723
ArtemESC
2007-06-14 15:15
2007.07.15
Где можно скачать драйвер для CardReader?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский