Du hast FreeOnTerminate=True und
Delphi-Quellcode:
procedure TThPing.Execute;
begin
...
finally
FPing.Free;
DoThreadEnded;
end;
end;
Der Inhalt von DoThreadEnded wird also nahezu immer erst nach Ende des Threads und nach dessen Freigabe ausgeführt.

Grund: siehe mein letzter Post.
Ein Therapeut entspricht 1024 Gigapeut.