マルチスレッド アプリケーションを作成する場合、最も重要なことは、スレッド間の同期されたリソース アクセスを制御して、スレッドの安全な動作を確保することです。 Win 32 API は、この問題を解決するために、セマフォ、ミューテックス、クリティカル セクション、イベントなどの同期オブジェクトのセットを提供します。
Delphi は、イベント オブジェクトとクリティカル セクション オブジェクトをそれぞれ Tevent オブジェクトと TcriticalSection オブジェクトにカプセル化し、これら 2 つのオブジェクトの使用を簡単かつ便利にします。ただし、Delphi プログラムでセマフォやミューテックスなどのオブジェクトを使用する場合は、複雑な Win32 API 関数を使用する必要があり、Win32 API 関数に慣れていないプログラマにとっては非常に不便です。したがって、作成者は、大多数の Delphi プログラマの役に立つことを期待して、Delphi を使用してセマフォとミューテックス オブジェクト (それぞれ TSemaphore と TMutex) をカプセル化する 2 つのクラスを構築しました。
1. クラス構成
まず、Win32 API のセマフォ オブジェクトとミューテックス オブジェクトを抽象化し、親クラス THandleObjectEx を構築し、次にこの親クラスから 2 つのサブクラス Tsemphore と Tmutex を派生します。
クラスのソースコードは次のとおりです。
ユニットSyncobjsEx;
インタフェース
Windows、メッセージ、SysUtils、クラス、Syncobjs を使用します。
タイプ
THandleObjectEx = クラス(THandleObject)
// THandleObjectEx は相互排除クラスとセマフォ クラスの親クラスです
保護されています
Fハンドル: Tハンドル;
FLastError: 整数;
公共
デストラクタ オーバーライド;
プロシージャ リリース;オーバーライド;
関数 WaitFor(タイムアウト: DWord): TWaitResult;
プロパティ LastError:Integer 読み取り FLastError;
プロパティ ハンドル: THandle 読み取り FHandle;
終わり;
TMutex = class(THandleObjectEx)//相互に排他的なクラス
公共
コンストラクター Create(MutexAttributes: PSecurityAttributes; InitialOwner: Boolean; const Name:string);
プロシージャのオーバーライド。
終わり;
TSemaphore = クラス(THandleObjectEx)
//信号灯クラス
公共
コンストラクター Create(SemaphoreAttributes: PSecurityAttributes;InitialCount:Integer;MinimumCount:integer;const Name:string);
プロシージャ Release(ReleaseCount: Integer=1;PreviousCount:Pointer=nil);