繁体   English   中英

在Android的Delphi 10中终止线程

[英]Terminating a thread in Delphi 10 with Android

我正在使用以下指示的基本设置创建一个线程。 显然,一切正常,但是当我运行MyThread.Terminate我注意到Destroy无法运行。 Destroy仅在关闭主应用程序时执行。

结束线程的正确方法是什么?

基本线程

// MyThread "TPoolingThread"
constructor TPoolingThread.Create;
begin
   inherited Create(True);

   // Initializing something
end;

destructor TPoolingThread.Destroy;
begin
   inherited Destroy;
end;

procedure TPoolingThread.Execute;
begin
   try
      while (not Terminated) do begin
         sleep(100);
         // do something
      end;
   finally
      if not Terminated then
         Terminate;
   end;
end;

执行线程

// Main Application 

   //////////////////////////////////////////
   // Create and Start
   MyThread := TPoolingThread.Create;

   if Assigned(MyThread.FatalException) then
      raise MyThread.FatalException;

   MyThread.Start;

   //////////////////////////////////////////
   // Stop
   MyThread.Terminate;

. 我想通过定义来开头我的回答。 you mean to stop your loop in the TPoolingThread.Execute procedure. 我将假设通过意味着停止TPoolingThread.Execute过程中的循环。

终止线程

用于终止线程的方法是完全可以接受的。 现在,为什么,请允许我向您展示此片段

版本1

在Try-Finally构造中,无论try子句中发生了什么,都保证可以绝对执行Final语句。 但是,Finally子句实际上并不处理任何异常-如果未找到Except子句,则程序将终止(请参见下面的注释)。

因此,如果循环中的代码引发异常,则告诉TPoolingThread对象它已终止。

为什么销毁没有被召唤

正如雷米·勒博(Remy Lebeau)和达莉亚·普拉斯尼卡(Dalija Prasnikar)所说 终止不应该称为销毁:

System.Classes.TThread.Terminate:

通过将Terminated属性设置为true来指示线程终止。 Terminate将线程的Terminated属性设置为true,表示应尽快终止线程。

为了使Terminate起作用,线程的Execute方法和Execute调用的任何方法都应定期检查Terminated并在其为true时退出。

如果您想了解有关Delphi中用于Android开发的ARC的更多信息,我将保留此链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM