Critical Sections 

www.madshi.net

The interface "ICriticalSection" encapsulates the critical section APIs, which are mostly used to protect resources in a multi threaded application. To see a full list of the methods look at the ICriticalSection Reference.

type ICriticalSection = interface (IBasic) ['{82546200-8D73-11D3-A52E-00005A180D69}'];

Creating a new critical section is easy:

function NewCriticalSection : ICriticalSection;

Use the methods "Enter/Leave" to enter/leave a critical section (see APIs "Enter/LeaveCriticalSection"). If the critical section is already locked by another thread, entering the section means that your thread will go in a wait state until the other thread leaves the section. You can also use the method "TryEnter" (see API "TryEnterCriticalSection"), which is however not available in win95.

procedure ICriticalSection.Enter;
function  ICriticalSection.TryEnter : boolean;

function  ICriticalSection.Leave : boolean;

The following method returns whether this section is owned by the current thread:

function ICriticalSection.IsOwnedByCurrentThread : boolean;

The method "OwnerThread" returns the ID of the thread that currently owns this critical section. The method "LockCount" returns how often the owning thread has entered the session in the moment. If the critical section is not by the current thread, these informations can change at any time, namely in that moment when another thread enters or leaves the critical section.

function ICriticalSection.OwnerThread : cardinal;
function ICriticalSection.LockCount   : integer;