tthread не освобождает память

procedure TForm1.Button1Click(Sender: TObject);
begin
 Test:=Ttest.Create(true);
 Test.Resume; //запустить/возобновить
 Test.FreeOnTerminate:=true; //освободить память после завершения
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 Test.Suspend; //приостановить
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 Test.Terminate; //остановить
end;

а память не освобождает после остановы  

1 комментарий

  • Поток и не должен освобождаться после останова.
    Suspend использует системную функцию SuspendThread, которая просто не дает системе переключаться на обработку функции потока — своеобразная "заморозка"
    FreeOnTerminate работает только если обработка функции потока завершена (это можно увидеть в classes.pas function ThreadProc(Thread: TThread): Integer;)
    Метод Terminate не освобождает поток а меняет значение логического поля потока FTerminated, значение которого можно получить из свойства Terminated.
    Это свойство должно проверяться в методе Execute потока, например так if not terminated then …
    Если поток может быть "заморожен" по логике программы, обработка Button3Click должны быть изменена на
    procedure TForm1.Button3Click(Sender: TObject);
    begin
    Test.Terminate; //остановить
    if Test.Suspended then Test.Resume;
    end;