Форум: "Начинающим";
Текущий архив: 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