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を継承したクラスを作成するのが面倒で、スレッドを使わずに手を抜いていたような場面が少なくなりそうです。
Pingback: C++Builder XEでTThread.CreateAnonymousThreadを使ってみる。 « 山本隆の開発日誌