Semaphores

mens en Mutex kan brukes til å tillate bare en enkelt forekomst av programmet ditt, kan en Semaphore bruke til å tillate en bestemt number.Creating semaphoresA semafor er opprettet ved hjelp vinduene CreateSemaphore API command.HANDLE CreateSemaphore (LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, //sikkerhets attributter LONG lInitialCount, //innledende teller LONG lMaximumCount, //maksimale antallet LPCTSTR lpName //peker til semafor-objekt navn); ExampleHSemaphore: = CreateSemaphore (null, MaximumInstances, MaximumInstances, PChar (UniqueName)); Unikt navn må være en Windows- bred unik identifikator, anbefaler jeg at du bruker CompanyName.ProductName, eller enda en GUID (Trykk CTRL + SHIFT + G for å generere en GUID på design tid) .Her er en klasse wrapper for en semafor, opprette en forekomst av klassen og bruk . LOCK å bruke en reservert plass og låse opp for å slippe den enhet
semaforer; grensesnitt
bruker
Windows, SysUtils; konst
cSemaphoreCannotCreate = 'ikke Can skape semafor '; skriv
ESemaphoreError = klasse
(Unntak); TSemaphore = klasse
privat
HSemaphore: THandle; Flokket: Boolean; offentlig
Constructor
Lag (UniqueName: string
; MaximumInstances: Integer); virtuell
; destructor
Destroy; styre
; funksjon
Lock (aTimeoutMilliseconds: DWORD): boolsk; prosedyre
UnLock; eiendom
Låst: Boolean Les
strømmet; end
; gjennomføringen {TSemaphore} konstruktør TSemaphore.Create (UniqueName: String; MaximumInstances: integer); begynne arvet Opprett; Flokket: = False; HSemaphore: = 0; HSemaphore: = CreateSemaphore (null, MaximumInstances, MaximumInstances, PChar (UniqueName)); hvis HSemaphore = 0 deretter heve ESemaphoreError.Create (cSemaphoreCannotCreate); ende; destructor TSemaphore.Destroy; begynne UnLock; arvet; ende, funksjons TSemaphore.Lock (aTimeoutMilliseconds: DWORD): boolske; Var Res: Integer; begynne Res: = WaitForSingleObject (hSemaphore, aTimeoutMilliseconds); Resultat: = (Res i [WAIT_ABANDONED, WAIT_OBJECT_0]); Hvis resultatet deretter strømmet: = true; ende; prosedyre TSemaphore.UnLock; begynne hvis ikke låst og avslutter; ReleaseSemaphore (hSemaphore, en, null); end; end
.



Next Page: