クリティカルセクション(Critical Section)
クリティカルセクションはWin32の機能のひとつで、不可分な処理の途中で他のスレッドが使用中のリソース(データなど)にアクセスするのを避けたいとき使用します。つまり、クリティカルセクションの中には1つのスレッドしか入れないようになっていて、別のスレッドによる使用中のデータの書き換えなどを禁止できます。
クリティカルセクションには名前がありません。つまり、クリティカルセクションは1つのプロセス内で使用します。
DelphiではTCriticalSectionが用意されているので簡単にクリティカルセクションを利用できます。
クリティカルセクションの作成
例
Critical := TCriticalSection.Create;
クリティカルセクション使用
クリティカルセクションには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;