ХЕЛП!!! Thread creation error : not enough storage

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by narik_, 5 Aug 2009.

  1. narik_

    narik_ Member

    Joined:
    5 Jun 2009
    Messages:
    0
    Likes Received:
    30
    Reputations:
    0
    Thread creation error : not enough storage
    После 10-20 мин работы проги выдает такую ошибку. 50 потоков работает.
    Нагруз на проц 1%
    На память 10 МБ
    Потоки каждый после работы удаляется.
    В чем может быть дело. Помогите плз.
     
    6 people like this.
  2. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    937
    Likes Received:
    162
    Reputations:
    27
    Выложи исходный код, или хотя бы часть которая отвечает за работу с потоками.
     
  3. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    После создания потока ты закрываешь его хендл?
    Ну и в конце каждого потока ExitThread(0)
     
  4. narik_

    narik_ Member

    Joined:
    5 Jun 2009
    Messages:
    0
    Likes Received:
    30
    Reputations:
    0
    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;
     
  5. narik_

    narik_ Member

    Joined:
    5 Jun 2009
    Messages:
    0
    Likes Received:
    30
    Reputations:
    0
    Наверное потоки не удаляются потому что диспетчер опказывает нарастание памяти проги в оператве. Доходя до 30Мб скачут ошибки а на 34 вырубаетсяпрога. Но потоки то дестроятся вроде норм. хз непойму :(
     
  6. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    Смотри внимательно где ты освобождаешь ресурсы и правильно ли ты это делаешь.
     
  7. narik_

    narik_ Member

    Joined:
    5 Jun 2009
    Messages:
    0
    Likes Received:
    30
    Reputations:
    0
    Да вот смотри. Поток какбы удаляется. Но из памяти не удаляеться. Только из переменной наверное. Код я написал. В чем дело хз.
     
  8. ZdezBilYa

    ZdezBilYa Elder - Старейшина

    Joined:
    29 Aug 2008
    Messages:
    198
    Likes Received:
    75
    Reputations:
    19
    попробуй использовать ExitThread(0)
     
  9. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    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
    имхо... хотя мог и ошибиться, забыл уже дельфи =(
     
  10. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    937
    Likes Received:
    162
    Reputations:
    27
    По моему достаточно присвоить переменной FreeOnTerminate значение True, как написал W!z@rD. Я в своих программах так делаю, - потоки освобождают память. Но я не переписываю конструктор/деконструктор, я при создании потока присваиваю его параметру FreeOnTerminate данное значение.