![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Потоки кушают оперативку. + 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;
вынеси в конструктор потока