Мне интересно, безопасно ли использовать следующий (псевдо) код. Я знаю о флаге Terminated, но мне нужно установить какой-то флаг отмены при операции рекурсивного поиска из основного потока и поддерживать работу рабочего потока. Я проверю там и свойство Terminated, чего не хватает в этом псевдокоде.
type
TMyThread = class(TThread)
private
FCancel: Boolean;
procedure RecursiveSearch(const ItemID: Integer);
protected
procedure Execute; override;
public
procedure Cancel;
end;
procedure TMyThread.Cancel;
begin
FCancel := True;
end;
procedure TMyThread.Execute;
begin
RecursiveSearch(0);
end;
procedure TMyThread.RecursiveSearch(const ItemID: Integer);
begin
if not FCancel then
RecursiveSearch(ItemID);
end;
procedure TMainForm.ButtonCancelClick(Sender: TObject);
begin
MyThread.Cancel;
end;
Безопасно ли устанавливать логическое свойство FCancel внутри потока таким образом? Не будет ли это конфликтовать с чтением этого флага в процедуре RecursiveSearch, пока нажата кнопка в основной форме (основном потоке)? Или мне придется добавить, например. критический раздел для чтения и записи этого значения?
Большое спасибо