Delphi 無名メソッド(無名関数)で簡単スレッド + OnTerminate
無名メソッドで、簡単使い捨て?スレッド
Suspend = True
FreeOnTerminate = True
で、Thread を生成するので、Start メソッドを付けてスレッドを開始させるだけ
【追記】
OnTerminate も無名メソッドで記載してみる
当初、こちらを参考にしていましたが、64bitでコンパイルすると正しく動作しないため、こちらも参考にして、MethRefToMethPtr と MakeNotify 関数(汎用的に使えるので、別に宣言してもよい)を挟んでます
OnTerminate って、メインスレッドで実行されるので Synchronize は必要ないんですね(Delphiのヘルプに記載されてました)
Caption := 'Wait...';
TThread.CreateAnonymousThread(
procedure
begin
Sleep(3000);
TThread.Synchronize(TThread.CurrentThread,
procedure()
begin
Form1.Caption := 'Done';
end);
end).Start;
CreateAnonymousThread メソッドは、Suspend = True
FreeOnTerminate = True
で、Thread を生成するので、Start メソッドを付けてスレッドを開始させるだけ
【追記】
OnTerminate も無名メソッドで記載してみる
type
TNotifyEventProc = reference to procedure(Sender: TObject);
// -------------
procedure TForm1.Button1Click(Sender: TObject);
procedure MethRefToMethPtr(const MethRef; var MethPtr);
type
TVtable = array [0 .. 3] of Pointer;
PVtable = ^TVtable;
PPVtable = ^PVtable;
begin
TMethod(MethPtr).Code := PPVtable(MethRef)^^[3];
TMethod(MethPtr).Data := Pointer(MethRef);
end;
function MakeNotify(const Proc: TNotifyEventProc): TNotifyEvent;
begin
MethRefToMethPtr(Proc, Result);
end;
begin
with TThread.CreateAnonymousThread(
procedure
begin
// スレッドで処理する内容
Sleep(1000);
TThread.Synchronize(TThread.CurrentThread,
procedure()
begin
Form1.Caption := 'Start';
end);
Sleep(2000);
end) do begin
OnTerminate := MakeNotify(
procedure(Sender: TObject)
begin
// OnTerminate で処理する内容
Form1.Caption := 'Finish';
end);
Start;
end;
end;
with でくくって、OnTerminate へイベントを投入してみた(TThread型へ入れたほうが見やすい?)ワケですが一筋縄ではいきません当初、こちらを参考にしていましたが、64bitでコンパイルすると正しく動作しないため、こちらも参考にして、MethRefToMethPtr と MakeNotify 関数(汎用的に使えるので、別に宣言してもよい)を挟んでます
OnTerminate って、メインスレッドで実行されるので Synchronize は必要ないんですね(Delphiのヘルプに記載されてました)
コメント