Безопасно ли устанавливать логическое значение в потоке из другого?

Мне интересно, безопасно ли использовать следующий (псевдо) код. Я знаю о флаге 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, пока нажата кнопка в основной форме (основном потоке)? Или мне придется добавить, например. критический раздел для чтения и записи этого значения?

Большое спасибо

9
задан Martin Reiner 8 March 2012 в 16:11
поделиться

0 ответов

Другие вопросы по тегам:

Похожие вопросы: