Delphi 無名メソッド(無名関数)で簡単スレッド + OnTerminate

無名メソッドで、簡単使い捨て?スレッド
  1. Caption := 'Wait...';  
  2. TThread.CreateAnonymousThread(  
  3.     procedure  
  4.     begin  
  5.         Sleep(3000);  
  6.         TThread.Synchronize(TThread.CurrentThread,  
  7.             procedure()  
  8.             begin  
  9.                 Form1.Caption := 'Done';  
  10.             end);  
  11.     end).Start;  
CreateAnonymousThread メソッドは、
Suspend = True
FreeOnTerminate = True
で、Thread を生成するので、Start メソッドを付けてスレッドを開始させるだけ

【追記】
OnTerminate も無名メソッドで記載してみる
  1. type  
  2.     TNotifyEventProc = reference to procedure(Sender: TObject);  
  3. // -------------  
  4. procedure TForm1.Button1Click(Sender: TObject);  
  5.     procedure MethRefToMethPtr(const MethRef; var MethPtr);  
  6.     type  
  7.         TVtable = array [0 .. 3of Pointer;  
  8.         PVtable = ^TVtable;  
  9.         PPVtable = ^PVtable;  
  10.     begin  
  11.         TMethod(MethPtr).Code := PPVtable(MethRef)^^[3];  
  12.         TMethod(MethPtr).Data := Pointer(MethRef);  
  13.     end;  
  14.   
  15.     function MakeNotify(const Proc: TNotifyEventProc): TNotifyEvent;  
  16.     begin  
  17.         MethRefToMethPtr(Proc, Result);  
  18.     end;  
  19. begin  
  20.     with TThread.CreateAnonymousThread(  
  21.         procedure  
  22.         begin  
  23.             // スレッドで処理する内容  
  24.             Sleep(1000);  
  25.             TThread.Synchronize(TThread.CurrentThread,  
  26.                 procedure()  
  27.                 begin  
  28.                     Form1.Caption := 'Start';  
  29.                 end);  
  30.             Sleep(2000);  
  31.         enddo begin  
  32.   
  33.         OnTerminate := MakeNotify(  
  34.             procedure(Sender: TObject)  
  35.             begin  
  36.                 // OnTerminate で処理する内容  
  37.                 Form1.Caption := 'Finish';  
  38.             end);  
  39.         Start;  
  40.     end;  
  41. end;  
with でくくって、OnTerminate へイベントを投入してみた(TThread型へ入れたほうが見やすい?)ワケですが一筋縄ではいきません
当初、こちらを参考にしていましたが、64bitでコンパイルすると正しく動作しないため、こちらも参考にして、MethRefToMethPtr と MakeNotify 関数(汎用的に使えるので、別に宣言してもよい)を挟んでます

OnTerminate って、メインスレッドで実行されるので Synchronize は必要ないんですね(Delphiのヘルプに記載されてました)

コメント