Вопрос
Как правильно завершить поток и освободить занимаемую им память — в примере, описанном ниже, если код 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 можно не вызывать — поток сам освободит занимаемую память при завершении.
Copyright 2000-2004 Сообщество Чайников
Контактная информация