我想检查匿名线程是否正在运行,我有一个想法,即每隔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;
答案 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”,你可以使用这个对象......