DelphiのTThread.CreateAnonymousThreadと無名メソッドを使うと、簡単なスレッド処理なら手軽にかける

TThread.CreateAnonymousThreadを使うと、簡単なスレッド処理なら手軽に書くことができます。

CreateAnonymousThreadメソッドは引数にスレッドで行う処理を与えます。
処理は無名メソッドを使うと簡潔に記述できます。

class function CreateAnonymousThread(const ThreadProc: TProc): TThread; static;

返値のTThreadは一時停止の状態になっているので、Startメソッドを呼んで実行します。

TThread.CreateAnonymousThread(
  procedure()
  begin
    Sleep(10000); //時間のかかる処理
  end).Start;

次のサンプルプログラムでは、ボタン1はスレッドを使用しない処理、ボタン2ではスレッドを使用した処理になっています。
ボタン1を押すと処理が終わるまで入力できませんが、ボタン2を押すとすぐに入力欄に入力することができます。

procedure TForm1.Button1Click(Sender: TObject);
begin
  Caption := 'Start';
  Sleep(10000); //時間のかかる処理
  Caption := 'OK';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Caption := 'Start';
  TThread.CreateAnonymousThread(
    procedure()
    begin
      Sleep(10000); //時間のかかる処理
      Caption := 'OK';
    end).Start;
end;


ボタン1を押すとフォームが固まる。
ボタン1は押された状態のまま。


ボタン2を押すとボタンはすぐに戻り、入力欄に入力できる状態になる。

無名メソッドを使っているため、スレッドからフォームのCaptionを簡単に操作できています。

ただし、メインスレッドのオブジェクトを安全に操作するには、Synchronizeメソッドを使う必要があります。

procedure TForm1.Button2Click(Sender: TObject);
begin
  Caption := 'Start';
  TThread.CreateAnonymousThread(
    procedure()
    begin
      Sleep(10000); //時間のかかる処理
      //Synchronizeメソッドを使う
      TThread.Synchronize(TThread.CurrentThread,
        procedure
        begin
          Caption := 'OK';
        end);
    end).Start;
end;

TThread.CreateAnonymousThreadと無名メソッドを使うと、スレッドの処理を簡単に記述できます。

TThreadを継承したクラスを作成するのが面倒で、スレッドを使わずに手を抜いていたような場面が少なくなりそうです。

コメント

  1. Pingback: C++Builder XEでTThread.CreateAnonymousThreadを使ってみる。 « 山本隆の開発日誌

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください