Beim Schreiben von Multithread-Anwendungen ist es am wichtigsten, den synchronisierten Ressourcenzugriff zwischen Threads zu steuern, um den sicheren Betrieb der Threads sicherzustellen. Die Win 32-API bietet eine Reihe von Synchronisierungsobjekten wie Semaphore, Mutex, Critical Section und Event, um dieses Problem zu lösen.
Delphi kapselt Ereignisobjekte und kritische Abschnittsobjekte in Tevent-Objekte bzw. TcriticalSection-Objekte, wodurch die Verwendung dieser beiden Objekte einfach und bequem wird. Wenn Sie jedoch Objekte wie Semaphoren oder Mutexe in einem Delphi-Programm verwenden möchten, müssen Sie auf komplexe Win32-API-Funktionen zurückgreifen, was für Programmierer, die mit Win32-API-Funktionen nicht vertraut sind, sehr umständlich ist. Daher verwendete der Autor Delphi, um zwei Klassen zur Kapselung der Semaphor- und Mutex-Objekte (TSemaphore bzw. TMutex) zu konstruieren, in der Hoffnung, für die Mehrheit der Delphi-Programmierer hilfreich zu sein.
1. Klassenstruktur
Wir abstrahieren zunächst das Semaphorobjekt und das Mutexobjekt der Win32-API, erstellen eine übergeordnete Klasse THandleObjectEx und leiten dann zwei Unterklassen Tsemphore und Tmutex von dieser übergeordneten Klasse ab.
Der Quellcode der Klasse lautet wie folgt:
Einheit SyncobjsEx;
Schnittstelle
verwendet Windows,Messages,SysUtils,Classes,Syncobjs;
Typ
THandleObjectEx = class(THandleObject)
// THandleObjectEx ist die übergeordnete Klasse der gegenseitigen Ausschlussklasse und der Semaphorklasse
Geschützt
FHandle: THandle;
FLastError: Integer;
öffentlich
Destruktor Zerstören; überschreiben;
Prozedur Release;override;
function WaitFor(Timeout: DWord): TWaitResult;
Eigenschaft LastError:Integer read FLastError;
Eigenschaft Handle: THandle read FHandle;
Ende;
TMutex = class(THandleObjectEx)//Sich gegenseitig ausschließende Klasse
öffentlich
Konstruktor Create(MutexAttributes: PSecurityAttributes; InitialOwner: Boolean; const Name:string);
Prozedurfreigabe;
Ende;
TSemaphore = class(THandleObjectEx)
//Signallichtklasse
öffentlich
Konstruktor Create(SemaphoreAttributes: PSecurityAttributes;InitialCount:Integer;MaximumCount: integer; const Name: string);
procedure Release(ReleaseCount: Integer=1;PreviousCount:Pointer=nil);