【Delphi Sample】並列プログラミング1
【Delphi Sample】並列プログラミング1
Delphiの並列プログラミングのサンプルです。XE6あたりまではTThreadを利用していたと思いますが、XE7のカテゴリを見てみると、System.Threading ユニットが追加されています。
System.Threading
には並列プログラミングを作る際に便利なクラス群が実装されています。usesにSystem.Threading
を追加しておきましょう。
今回は一番基本的なITask、TTaskを利用してみます。
まず、並列「ではない」プログラミングを見てみましょう。以下のプログラムでは、1秒ごとにカウントをとっています。…しかし、この書き方では思った通りに動作しません。ボタンを押して数秒後にループの最後の数字である5が表示されます。
procedure TForm1.Button1Click(Sender: TObject);
var
i : integer;
begin
for i := 0 to 5 do
begin
Sleep(1000);
Edit1.Text := IntToStr(i);
end;
end;
上記の問題をITask、TTaskを利用して再度プログラミングをしてみます。
procedure TForm1.Button2Click(Sender: TObject);
var
task: ITask;
begin
task := TTask.Create(procedure()
var
i: integer;
begin
for i := 0 to 5 do
begin
Sleep(1000);
TThread.Synchronize(nil, procedure()
begin
Edit2.Text := IntToStr(i);
end);
end;
end);
task.Start;
end;
TTask.Create
の引数にプロシージャを与えるという、一見変わったスタイルになります。このように記述することで、プロシージャ内の処理は並列(非同期)で実行されます。
また、並列で実行しているときにEditなどのUIにアクセスしたい場合は、TThread.Synchronize
を利用します。これはUIはTTaskとは違う軸で処理されているからです。
コメント
コメントを投稿