Проверить состояние потока своей функцией

Доброго времени суток! Есть
type
 TNew_Thread = class(TThread)
 private
 { Private declarations }
 i: Integer;
 protected
 procedure Execute; override;
 procedure SyncProc;
 public
 end;

var
 Form1: TForm1;
 New_Thread: TNew_Thread;

implementation

{$R *.dfm}

function GetThreadStatus(Thread: TThread): string{Boolean};
begin
 if Thread <> nil then
 if Thread.Terminated then Result := 'Потока нет' else Result := 'Поток есть';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 New_Thread := TNew_Thread.Create(True);
 New_Thread.FreeOnTerminate := False{True};
 New_Thread.Resume;
end;

procedure TNew_Thread.Execute;
begin
 i := 0;

 while True do
 begin
 Inc(i);
 Synchronize(SyncProc);
 if Self.Terminated then Break;
 end;
end;

procedure TNew_Thread.SyncProc;
begin
 Form1.Caption := IntToStr(i);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 New_Thread.Terminate;
 New_Thread.WaitFor; // Ждём, когда поток "мирно" помрёт
 New_Thread.Free; // Высвобождать память
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 ShowMessage(GetThreadStatus(New_Thread));
end;
При компиляции ругается на
if Thread.<b><font color="Red">Terminated</font></b> then Result := 'Потока нет' else Result := 'Поток есть';
Undeclared identifier: 'Terminated' Помогите, пожалуйста разобраться.
6 ответов

Может стоит писать тип параметра как TNew_Thread ? просто само свойство Terminated описано как protected.


Stilet, в новых Delphi, свойство Terminated не видимо. Назначаете OnTerminate, FreeOnTerminate=TRUE, в OnTerminate делаете fThread = nil. Вся проверка сводится к Assigned(fThread). ВМетоде создания потока делаете проверку not Assigned(fThread), в методе убийства потока делаете проверку Assigned(fThread).Все.


Рискуете нарваться на исключение, если поток уже освобожден. И вообще это св-во для проверки внутри потокаADD Да, и Terminated=True не факт, что поток завершен


Stilet, в новых Delphi, свойство Terminated не видимо.
Ну я примерно это и говорил Только не очень удачно выразился.


в новых Delphi, свойство Terminated не видимо.
Как было это свойство protected в старых Дельфи, так оно и осталось в новых. Посмотреть его значение как можно было в старых, так можно и в новых. Только смысла в этом как не было так и нет.


th:=TTreadX.Crerate;
th.OnTerminate:=MyFreeThread; //действие которое будет выполнено при РЕАЛЬНОМ завершении потока
th.FreeOnterminate:=false; 

procedure TFX.MyFreeThread(sender: TObject);
begin 
 if sender =th then //по завершении НУЖНОГО нам потока 
 FreeAndNil(th); // очищаем переменную!!!! 
end;

function TestTh; string;
begin
 if th<>nil then result:='поток работает'
 else result:='поток не найден' 
end
TThreadx class(TThread)
public
 function testrun: string;
end;

function TThreadX.testrun: string;
begin
 if self=nil then result:='поток не найден'
 else if self.terminated then result:='поток готов к остановке'
 else result:='поток работает';
end;

showmessage(th.testrun);