运行此代码时:
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
为什么?
答案 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
处理程序中对线程的任何引用。