如何检查匿名线程是否正在运行

时间:2016-12-28 19:56:04

标签: multithreading delphi delphi-10.1-berlin

我想检查匿名线程是否正在运行,我有一个想法,即每隔1秒监视一次线程状态,如果存在,再次重启工作..

我有线程ID,现在如何检查状态?

procedure TForm2.Button5Click(Sender: TObject);
  begin
    TThread.CreateAnonymousThread(procedure   ()
    var i : integer;
    begin
      inc(i);

      label1.caption :=  TThread.Current.ThreadID.ToString;
    end).Start;
  end;

3 个答案:

答案 0 :(得分:3)

线程不会停止。如果您的线程停止运行,那是因为您的代码存在缺陷。即使问题中的简单代码也包含两个缺陷。它在初始化之前读取局部变量,并使用远离主线程的VCL方法。

你的问题的整个前提是错误的。您不需要监视您的线程是否仍在运行。您只需修复代码中的缺陷,使其不会失败。

答案 1 :(得分:1)

更好地了解线程是什么以及如何使用它们将对您有所帮助。线程通常是一种在不占用用户界面的情况下完成某些操作的方法。如果您希望用户等待某些事情完成,请不要使用线程,只需将工作代码放在buttonclick事件处理程序中,而不创建任何线程。

你说

  

每1秒,如果存在,重新开始工作

这没有任何意义。如果该线程存在,它仍然在忙着工作,所以不需要重新启动它。也许您应该告诉我们您希望线程完成哪些工作。

在下面的示例中(取自code in playground,您可以看到在完成工作时调用了Synchronize过程,因此您知道该线程是如何完成的,并且'工作。

procedure TForm2.Button5Click(Sender: TObject);
begin
  TThread.CreateAnonymousThread(procedure ()
  var i : integer;
  begin
    inc(i); // some work here

    TThread.Synchronize (TThread.CurrentThread,
      procedure ()
      begin
        label1.Caption := TThread.Current.ThreadID.ToString;       
      end);

  end).Start;

end;

答案 2 :(得分:-1)

TThread.CreateAnonymousThread是一个返回新线程实例的函数,如下所示:

var ms:TThread;
ms:=TThread.CreateAnonymousThread( .....

你有一个实例 - ms“aka Thread”,你可以使用这个对象......