今回はDelphi/400 XE3以降での
CreateAnonymousThreadを使った簡単なスレッド処理の使い方についてご紹介いたします。
例えば動作が止まってしまうような重たい処理をメインスレッドで実行した場合、
描画などが止まってしまい、フリーズしているように見えるだけでなく
待ち状態の表示などを思うような画面表現ができない場合があります。
こうした重い処理は別の匿名スレッドとして実行することで、
メインスレッドの処理を並行して進行させることができます。
例えばTProgressBarコンポーネントで進捗を表示させるような処理の場合、
無名メソッドとTTimerコンポーネントを使って次のようにコーディングすることができます。
// 処理ボタンのコーディング
procedure TForm1.Button1Click(Sender: TObject);
begin
ProgressBar1.Position := 0;
// タイマーイベント開始
Timer1.Enabled := True;
// 匿名メソッド・無名メソッドを定義
TThread.CreateAnonymousThread(
procedure()
begin
// 重たい処理の例(10秒待機)
Sleep(10000);
// 重たい処理が完了したらタイマーイベント停止
Timer1.Enabled := False;
ProgressBar1.Position := 100;
end).Start;
end;
// タイマーイベントのコーディング
procedure TForm1.Timer1Timer(Sender: TObject);
begin
// タイマーでProgressBarの進捗を進める
ProgressBar1.Position := ProgressBar1.Position + 5;
end;
これだけのコーディングで重たい処理を別スレッドで動かして、
メインスレッドで進捗状況の描画を同時進行することが可能です。
スレッドを使うと同時処理などを柔軟に制御することができるので、是非ご活用下さい。
<関連情報>
System.Classes.TThread.CreateAnonymousThread – RAD Studio API Documentation
(ミガロ.情報マガジン「MIGARO News!!」Vol.171 2015年2月号より)