delphi.gif (306 バイト) クリティカルセクション(Critical Section)


クリティカルセクションはWin32の機能のひとつで、不可分な処理の途中で他のスレッドが使用中のリソース(データなど)にアクセスするのを避けたいとき使用します。つまり、クリティカルセクションの中には1つのスレッドしか入れないようになっていて、別のスレッドによる使用中のデータの書き換えなどを禁止できます。

クリティカルセクションには名前がありません。つまり、クリティカルセクションは1つのプロセス内で使用します。

DelphiではTCriticalSectionが用意されているので簡単にクリティカルセクションを利用できます。

 

toach.gif (917 バイト) クリティカルセクションの作成

Critical := TCriticalSection.Create;

toach.gif (917 バイト) クリティカルセクション使用

クリティカルセクションにはEnterメソッドで入り、Leaveメソッドで出ます。クリティカルセクションには1つのスレッドしか入れないので、あるデータに依存した不可分な処理を記述します。

  while True do
  begin
      Inc(n);
      if n > 1000 then      // nが1000ごとにカウント
      begin
        Critical.Enter;
        Inc(Form1.Count);
        // ここに現在のCountの値と不可分な処理を追加

        Critical.Leave;
        n := 0;
      end;
      if Terminated = True then
      begin
        Destroy;
        Exit;
      end;
   	  Application.ProcessMessages;
  end;