Mi chiedo se il seguente codice (pseudo) è sicuro da usare. So di Flag terminato, ma ho bisogno di impostare una sorta di flag di annullamento all'operazione di ricerca ricorsiva dal thread principale e mantenere attivo il thread di lavoro. Controllerò anche la proprietà terminata, cosa manca in questo pseudo codice.È sicuro impostare il valore booleano nel thread da un altro?
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;
È sicuro impostare FCancel nella proprietà booleana all'interno del thread in questo modo? Questo non si scontrerebbe con la lettura di questo flag nella procedura RecursiveSearch mentre il pulsante nel form principale (thread principale) viene premuto? O dovrò aggiungere per es. sezione critica per la lettura e la scrittura di questo valore?
Grazie mille
Se ricordo correttamente, un incarico intero è atomico e come tale thread sicuro. – iamjoosy
Sembra che tu abbia duplicato la proprietà 'Terminated' ... dovrebbe essere sicuro. – jpfollenius
Grazie a tutti; Il commento di Smasher sulla duplicazione della proprietà terminata è la migliore spiegazione. –