首页 > 解决方案 > 为什么我不能在外部创建的线程上调用 CheckTerminated?

问题描述

当我运行此代码时:

  FMyThread := TThread.createAnonymousThread(
   procedure
   begin
     while not FMyThread.CheckTerminated do begin
       sleep(750);
       TThread.synchronize(nil,
         procedure
         begin
           if FMyThread.CheckTerminated then exit;
           ....
         end);
     end;
   end);
   FMyThread.start;

我有例外

无法在外部创建的线程上调用 CheckTerminated

为什么 ?

标签: delphidelphi-xe2

解决方案


如果您查看 CheckTerminated 的实现,您会注意到它不是一个方法,而是一个静态类方法。

CheckTerminated指示当前正在执行的线程是否将其Terminated标志设置为TRUE。当您在 TThread.synchronize 中调用 FMyThread.CheckTerminated 时,它不会检查 FMyThread.Terminated,它会尝试检查“GetCurrentThreadId”的状态,在这种情况下,它是您进程的主线程。

由于主线程不是由 TThread 创建的,因此 RTL 创建了一个TExternalThread(参见class function TThread.GetCurrentThread: TThread

换句话说,如果你有一个 TThread 对象并想检查它是否被终止,你应该调用Terminated,而不是CheckTerminated

由于 AnonymousThread 默认在终止时释放,因此您需要确保清除OnTerminate处理程序中对线程的任何引用。


推荐阅读