Как правильно завершить поток и освободить занимаемую им память?

Вопрос:

    Как правильно завершить поток и освободить занимаемую им память - в примере, описанном ниже, если код MyThrd.Terminate; MyThrd.Free; после выхода из потока вешает компьютер. При отработке кода до конца (без принудительного останова) никаких проблем не возникает.
    Пример:
    Procedure TMyThread.Execute;
    Begin
    ::::: .
    Recurs(: .);
    :::::
    End;
    Procedure TMyThread.Recurs(: ..);
    Begin
    ::::: .
    Recurs(: .);
    :::::
    End;
    

Ответ:

    Проблема в том, что вызов Terminate не означает немедленного завершения потока. Terminate просто устанавливает в true поле Terminated, так что во время вызова MyThread.Free поток еще выполняется, откуда и проблемы! Чтобы избавиться от них, можно в начале Recurs поставить проверку Terminated:
    procedure TMyThread.Recurs;
    begin
    if Terminated then
    exit;
    .....
    Recurs(...);
    if Terminated then
    exit;
    .....
    end;
    После вызова Terminate надо ещё вызвать TMyThread.WaitFor, чтобы дождаться, пока поток действительно завершится. Ещё небольшое примечание: у TThread есть свойство FreeOnTerminate. Если оно равно true, то Free можно не вызывать - поток сам освободит занимаемую память при завершении.