Безопасно ли переопределять метод Free? - PullRequest
3 голосов
/ 21 сентября 2011

Безопасно ли переопределять метод Free ?Я спрашиваю, потому что я хотел бы использовать что-то подобное.Я знаю, что очень уродливо использовать TerminateThread , но в моем случае очень важно немедленно завершить процесс всеми его потоками.

Я видел метод __free, объявленный в System.pas, но я не знаю, имеет ли он какое-то отношение к методу TObject.Free , и поэтому я спрашиваю, безопасно ли это.

type
  TMyThread = class(TThread)
  private
    destructor Destroy; override;
  public
    procedure Execute; override;
    constructor Create;
    procedure Free(const Force: Boolean = False); // is it safe to use this?
  end;

procedure TMyThread.Free(const Force: Boolean = False);
begin
  if not Force then
  begin
    Terminate;
    WaitFor;
  end
  else
    TerminateThread(Handle, 0);

  inherited Free;
end;

destructor TMyThread.Destroy;
begin
  // free resources etc.
  inherited Destroy;
end;

Спасибо

1 Ответ

10 голосов
/ 21 сентября 2011

Вы не можете переопределить Free, потому что это не виртуально.Если вы определите свой собственный метод Free, он будет скрывать метод TObject.Free (обратите внимание на предупреждение компилятора), если статический тип является вашим типом класса.Это определенно не очень хорошая идея, так как объект никогда не будет разрушен.

Я не вижу причин, почему вы хотите это сделать.Если вы действительно хотите использовать TerminateThread, просто дайте вашему классу потока другой метод ForceTerminate, в котором вы вызываете TerminateThread.

...