СообЧа > База Знаний > Программирование > Delphi

Вопрос

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