PDA

Просмотр полной версии : ХЕЛП!!! Thread creation error : not enough storage


narik_
05.08.2009, 21:41
Thread creation error : not enough storage
После 10-20 мин работы проги выдает такую ошибку. 50 потоков работает.
Нагруз на проц 1%
На память 10 МБ
Потоки каждый после работы удаляется.
В чем может быть дело. Помогите плз.

Chrome~
05.08.2009, 22:25
Выложи исходный код, или хотя бы часть которая отвечает за работу с потоками.

slesh
05.08.2009, 22:41
После создания потока ты закрываешь его хендл?
Ну и в конце каждого потока ExitThread(0)

narik_
06.08.2009, 00:24
procedure ge.Execute;

begin
try

Synchronize(unit1.Form1.porgr);

self.Terminate;
self.Free;
self.Destroy;
except
Synchronize(unit1.Form1.porgr);

self.Terminate;
self.Free;
self.Destroy;
end;
end;

narik_
06.08.2009, 00:32
Наверное потоки не удаляются потому что диспетчер опказывает нарастание памяти проги в оператве. Доходя до 30Мб скачут ошибки а на 34 вырубаетсяпрога. Но потоки то дестроятся вроде норм. хз непойму :(

razb
06.08.2009, 01:25
Смотри внимательно где ты освобождаешь ресурсы и правильно ли ты это делаешь.

narik_
06.08.2009, 01:50
Да вот смотри. Поток какбы удаляется. Но из памяти не удаляеться. Только из переменной наверное. Код я написал. В чем дело хз.

ZdezBilYa
06.08.2009, 02:00
попробуй использовать ExitThread(0)

W!z@rD
06.08.2009, 07:03
procedure ge.Execute;

begin
try

Synchronize(unit1.Form1.porgr);

self.Terminate;
self.Free;
self.Destroy;
except
Synchronize(unit1.Form1.porgr);

self.Terminate;
self.Free;
self.Destroy;
end;
end;

o_O
Пишу по памяти...
Ты наследушься от класса TThread.
перекрываешь метод Execute;
При необходимости пишешь свой конструктор, деструктор.

constructor Create(CreateSuspended: Boolean);
begin
self.FreeOnTerminate:=true;
end;

procedure ge.Execute; override
begin
try
SomeLogic
except
self.Terminate;
finally
Synchronize(unit1.Form1.porgr);
end
имхо... хотя мог и ошибиться, забыл уже дельфи =(

Chrome~
06.08.2009, 14:23
По моему достаточно присвоить переменной FreeOnTerminate значение True, как написал W!z@rD. Я в своих программах так делаю, - потоки освобождают память. Но я не переписываю конструктор/деконструктор, я при создании потока присваиваю его параметру FreeOnTerminate данное значение.