例:
次のスレッドがあると仮定します(この例のスレッドコンテキスト実行メソッドで使用されているものを考慮しないでください。これは説明のためだけです)。
type
TSampleThread = class(TThread)
private
FOnNotify: TNotifyEvent;
protected
procedure Execute; override;
public
property OnNotify: TNotifyEvent read FOnNotify write FOnNotify;
end;
implementation
procedure TSampleThread.Execute;
begin
while not Terminated do
begin
if Assigned(FOnNotify) then
FOnNotify(Self); // <- this method can be called anytime
end;
end;
OnNotify
次に、必要なときにいつでもイベントのメソッドをメインスレッドから変更したいとします。このメインスレッドは、イベントハンドラメソッドを次のメソッドとして実装しThreadNotify
ます。
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
FSampleThread: TSampleThread;
procedure ThreadNotify(Sender: TObject);
end;
implementation
procedure TForm1.ThreadNotify(Sender: TObject);
begin
// do something; unimportant for this example
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
FSampleThread.OnNotify := nil; // <- can this be changed anytime ?
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
FSampleThread.OnNotify := ThreadNotify; // <- can this be changed anytime ?
end;
質問:
いつでも別のスレッドのコンテキストからワーカースレッドから呼び出すことができるメソッドを変更しても安全ですか?上記の例に示されていることを実行しても安全ですか?
少なくともメソッドポインタは実際にはポインタのペアであり、それを不可分操作と見なすことができるかどうかわからないため、それが絶対に安全かどうかは正確にはわかりません。