【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とは違う軸で処理されているからです。

コメント

このブログの人気の投稿

【KotlinとJava】分解宣言

wxPythonでのモーダルダイアログ作成