TThread не освобождает ручку - PullRequest
3 голосов
/ 27 января 2012

У меня есть следующий сервис, написанный на Delphi 2007, который, как мне кажется, не выпускает дескриптор потока. Функции CurrentMemoryUsage и GetOpenHandles являются функциями для возврата используемой памяти и номера дескриптора, используемого приложением. Таймер срабатывает каждую секунду, создавая нить, которая немедленно уничтожается. И я вижу в своем журнале Количество открытых дескрипторов с шагом в один раз. Это очень простой вопрос.

TMyThread = class(TThread)
private
protected
  procedure Execute; override;
public
  constructor Create(CreateSuspended: Boolean);
  destructor Destroy; override;
end;


procedure TMyService.MyTimerTimer(Sender: TObject);
var
    MyThread : TMyThread;
begin
    MyThread := TMyThread.Create(True);
    MyThread.OnTerminate := ThreadTerminated;
    MyThread.FreeOnTerminate := True;
    MyThread.Resume;
end;

procedure TMyThread.Execute;
begin
  FreeOnTerminate := True;
end;

destructor TMyThread.Destroy;
begin
   appendtolog((FormatFloat('Memory used: ,.# K', CurrentMemoryUsage / 1024))+',Number of Handles:'+inttostr(GetOpenHandles)) ;
end;

constructor TMyThread.Create(CreateSuspended: Boolean);
begin
  inherited Create(CreateSuspended);
end;

procedure TMyService.ThreadTerminated(Sender: TObject);
begin
  appendtolog('thread terminiated');
end;

1 Ответ

7 голосов
/ 27 января 2012

Вы забыли позвонить по наследству Destroy. Это то, что освобождает системные ресурсы, связанные с потоком.

destructor TMyThread.Destroy;
begin
  appendtolog((FormatFloat('Memory used: ,.# K', 
    CurrentMemoryUsage / 1024))+',Number of Handles:'+inttostr(GetOpenHandles));
  inherited;
end;
...