Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   ХЕЛП!!! Thread creation error : not enough storage (https://forum.antichat.xyz/showthread.php?t=133157)

narik_ 05.08.2009 21:41

ХЕЛП!!! Thread creation error : not enough storage
 
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

Цитата:

Сообщение от narik_
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;
При необходимости пишешь свой конструктор, деструктор.

PHP код:

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

procedure ge.Executeoverride
begin
try
SomeLogic
except
self
.Terminate;
finally
  
Synchronize(unit1.Form1.porgr);
end 

имхо... хотя мог и ошибиться, забыл уже дельфи =(

Chrome~ 06.08.2009 14:23

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


Время: 01:37