为什么不能在外部创建的线程上调用CheckTerminated?

时间:2019-08-09 17:17:20

标签: delphi delphi-xe2

运行此代码时:

  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

为什么?

1 个答案:

答案 0 :(得分:3)

如果查看CheckTerminated的实现,您会发现它不是方法,而是静态类方法。

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

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

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

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