Главная страница
    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.056 c
2-1182281812
Listt
2007-06-19 23:36
2007.07.15
ListBox и колонки


15-1181929921
Itonixxx
2007-06-15 21:52
2007.07.15
перекомпилировать Delphi код под Mac


1-1179159059
Dmitry_177
2007-05-14 20:10
2007.07.15
прокручивание таблицы StringGrid колесиком


1-1178897121
Dmitry_177
2007-05-11 19:25
2007.07.15
Можно ли в стандартном MessageBox-е добавить кнопку


2-1182357454
WFS
2007-06-20 20:37
2007.07.15
Как сохранить данные из таблицы DBGrid в файл с расширением .ma?





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