Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.09.2013, 16:53   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
Вопрос Проверить состояние потока своей функцией

Доброго времени суток!
Есть
Код:
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.Terminated then Result := 'Потока нет' else Result := 'Поток есть';
Undeclared identifier: 'Terminated'
Помогите, пожалуйста разобраться.
Shouldercannon вне форума Ответить с цитированием
Старый 30.09.2013, 18:21   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Может стоит писать тип параметра как TNew_Thread ?
просто само свойство Terminated описано как protected.
I'm learning to live...

Последний раз редактировалось Stilet; 30.09.2013 в 18:23.
Stilet вне форума Ответить с цитированием
Старый 30.09.2013, 18:24   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

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

Все.
Человек_Борща вне форума Ответить с цитированием
Старый 30.09.2013, 18:30   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Рискуете нарваться на исключение, если поток уже освобожден. И вообще это св-во для проверки внутри потока

ADD Да, и Terminated=True не факт, что поток завершен
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 30.09.2013 в 18:43.
Аватар вне форума Ответить с цитированием
Старый 30.09.2013, 22:03   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Stilet, в новых Delphi, свойство Terminated не видимо.
Ну я примерно это и говорил
Только не очень удачно выразился.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.09.2013, 22:24   #6
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
в новых Delphi, свойство Terminated не видимо.
Как было это свойство protected в старых Дельфи, так оно и осталось в новых. Посмотреть его значение как можно было в старых, так можно и в новых. Только смысла в этом как не было так и нет.
northener вне форума Ответить с цитированием
Старый 01.10.2013, 09:56   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
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);
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 01.10.2013 в 10:08.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить доступ к методу потока(TThread) из основного потока? Pcrepair Общие вопросы Delphi 3 30.03.2013 14:52
CheckBox. Как проверить состояние Шуримар Microsoft Office Access 5 17.01.2012 10:22
Должно быть 3 потока. А диспетчер задач показывает, что потока создано 2 BEL9ILLI Общие вопросы Delphi 3 06.12.2011 20:26
Как узнать номер потока из самого потока? GaMeSTeR Помощь студентам 0 03.12.2010 09:50
Как проверить существование потока? John_chek Общие вопросы Delphi 3 17.01.2008 15:16