Semaphoren


Während ein Mutex verwendet werden kann, um nur eine einzige Instanz Ihrer Anwendung zu ermöglichen, werden ein Semaphor können eine bestimmte Anzahl ermöglichen.
Erstellen von Semaphoren
Ein Semaphor wird mithilfe des Windows-API CreateSemaphore-Befehls erstellt.
Griff CreateSemaphore)
LPSECURITY_ATTRIBUTES LpSemaphoreAttributes, / / Sicherheitsattribute
LANGE lInitialCount / / erste Graf
LANGE lMaximumCount / / maximale Anzahl
LPCTSTR LpName / / Zeiger auf Semaphore-Objektnamen
);
Beispiel
HSemaphore: = CreateSemaphore (Nil, MaximumInstances,
MaximumInstances,PChar(UniqueName));
Eindeutiger Name muss eine eindeutige Kennung des Windows-weite sein, empfehle ich die Verwendung von CompanyName.ProductName oder sogar eine GUID (drücken Sie STRG + UMSCHALT + G eine GUID zur Entwurfszeit zu generieren).
Hier ist ein Klasse-Wrapper für ein Semaphor, erstellen Sie eine Instanz der Klasse und Sperre verwenden, um einen reservierten Platz und Unlock verwenden, um es freizugeben.
Einheit Semaphoren;
Schnittstelle
verwendet
Windows, SysUtils;
const
cSemaphoreCannotCreate = 'Semaphor kann nicht erstellt werden';
Typ
ESemaphoreError = Klasse(Ausnahme);
TSemaphore = Klasse
private
HSemaphore: THandle;
Strömten: Boolean;
öffentliche
Konstruktor Erstellen (UniqueName: String;

MaximumInstances: Integer); virtuelle;
Destruktor Zerstören; außer Kraft setzen;
Funktion Lock(aTimeoutMilliseconds: DWORD): Boolean;
Verfahren Entsperren;
Eigenschaft Gesperrt: Boolean Lesen beflockt;
end;
Umsetzung
{TSemaphore}
Konstruktor TSemaphore.Create (UniqueName: String;
MaximumInstances: Integer);
beginnen
geerbte erstellen;
Strömten: = False;
HSemaphore: = 0;
HSemaphore: = CreateSemaphore(nil,MaximumInstances,MaximumInstances,PChar(UniqueName));
Wenn HSemaphore = 0 then
ESemaphoreError.Create(cSemaphoreCannotCreate) zu erhöhen;
Ende;
Destruktor TSemaphore.Destroy;
beginnen
Entsperren;
erbte;
Ende;
Funktion TSemaphore.Lock(aTimeoutMilliseconds: DWord): Boolean;
var
Res: Integer;
beginnen
Res: = WaitForSingleObject (hSemaphore, aTimeoutMilliseconds);
Ergebnis: = (Res in [WAIT_ABANDONED, WAIT_OBJECT_0]);
Wenn dann, Ergebnis strömten: = True;
Ende;
Prozedur TSemaphore.UnLock;
beginnen
Wenn nicht gesperrt, dann Ausfahrt;
ReleaseSemaphore(hSemaphore,1,nil);
Ende;
Ende.









Semaphoren


Semaphoren : Mehreren tausend Tipps, um Ihr Leben einfacher machen.


Während ein Mutex verwendet werden kann, um nur eine einzige Instanz Ihrer Anwendung zu ermöglichen, werden ein Semaphor können eine bestimmte Anzahl ermöglichen.
Erstellen von Semaphoren
Ein Semaphor wird mithilfe des Windows-API CreateSemaphore-Befehls erstellt.
Griff CreateSemaphore)
LPSECURITY_ATTRIBUTES LpSemaphoreAttributes, / / Sicherheitsattribute
LANGE lInitialCount / / erste Graf
LANGE lMaximumCount / / maximale Anzahl
LPCTSTR LpName / / Zeiger auf Semaphore-Objektnamen
);
Beispiel
HSemaphore: = CreateSemaphore (Nil, MaximumInstances,
MaximumInstances,PChar(UniqueName));
Eindeutiger Name muss eine eindeutige Kennung des Windows-weite sein, empfehle ich die Verwendung von CompanyName.ProductName oder sogar eine GUID (drücken Sie STRG + UMSCHALT + G eine GUID zur Entwurfszeit zu generieren).
Hier ist ein Klasse-Wrapper für ein Semaphor, erstellen Sie eine Instanz der Klasse und Sperre verwenden, um einen reservierten Platz und Unlock verwenden, um es freizugeben.
Einheit Semaphoren;
Schnittstelle
verwendet
Windows, SysUtils;
const
cSemaphoreCannotCreate = 'Semaphor kann nicht erstellt werden';
Typ
ESemaphoreError = Klasse(Ausnahme);
TSemaphore = Klasse
private
HSemaphore: THandle;
Strömten: Boolean;
öffentliche
Konstruktor Erstellen (UniqueName: String;

MaximumInstances: Integer); virtuelle;
Destruktor Zerstören; außer Kraft setzen;
Funktion Lock(aTimeoutMilliseconds: DWORD): Boolean;
Verfahren Entsperren;
Eigenschaft Gesperrt: Boolean Lesen beflockt;
end;
Umsetzung
{TSemaphore}
Konstruktor TSemaphore.Create (UniqueName: String;
MaximumInstances: Integer);
beginnen
geerbte erstellen;
Strömten: = False;
HSemaphore: = 0;
HSemaphore: = CreateSemaphore(nil,MaximumInstances,MaximumInstances,PChar(UniqueName));
Wenn HSemaphore = 0 then
ESemaphoreError.Create(cSemaphoreCannotCreate) zu erhöhen;
Ende;
Destruktor TSemaphore.Destroy;
beginnen
Entsperren;
erbte;
Ende;
Funktion TSemaphore.Lock(aTimeoutMilliseconds: DWord): Boolean;
var
Res: Integer;
beginnen
Res: = WaitForSingleObject (hSemaphore, aTimeoutMilliseconds);
Ergebnis: = (Res in [WAIT_ABANDONED, WAIT_OBJECT_0]);
Wenn dann, Ergebnis strömten: = True;
Ende;
Prozedur TSemaphore.UnLock;
beginnen
Wenn nicht gesperrt, dann Ausfahrt;
ReleaseSemaphore(hSemaphore,1,nil);
Ende;
Ende.


Semaphoren

Semaphoren : Mehreren tausend Tipps, um Ihr Leben einfacher machen.
Semaphoren
Wiezutun
Freunden empfehlen
  • gplus
  • pinterest

Kommentar

Einen Kommentar hinterlassen

Wertung