Tandis qu'un Mutex peut être utilisé pour permettre à une seule instance de votre application, un Sémaphore peut être utilisé pour permettre à un nombre spécifique.
la Création de sémaphores
Un Sémaphore est créé à l'aide de la windows CreateSemaphore commande de l'API.
POIGNÉE CreateSemaphore(
& nbsp & nbsp LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,// les attributs de sécurité
& nbsp & nbsp LONG lInitialCount,// comptage initial
& nbsp & nbsp LONG lMaximumCount,// nombre maximal
& nbsp & nbsp LPCTSTR lpName // pointeur vers le sémaphore-nom de l'objet
)
Exemple
HSemaphore := CreateSemaphore(nil, MaximumInstances,
& nbsp & nbsp MaximumInstances,PChar(UniqueName))
nom Unique doit être un Windows à l'échelle de l'identificateur unique, je recommande que vous utilisez le nom de la Société.Le nom du produit, ou même un GUID (Appuyez sur CTRL MAJ G pour générer un GUID au moment de la conception).
Voici une classe wrapper pour un Sémaphore, créer une instance de la classe et de l'utiliser de VERROUILLAGE à utiliser une place réservée et Déverrouiller pour le libérer.
unité les Sémaphores
interface
& nbsp & nbsp Windows, SysUtils
const
& nbsp & nbsp cSemaphoreCannotCreate = 'Impossible de créer le sémaphore'
type
& nbsp & nbsp ESemaphoreError = class(Exception)
& nbsp & nbsp TSemaphore = class
& nbsp & nbsp privé
& ! & ! & ! & nbsp HSemaphore : THandle
& ! & ! & ! & nbsp Floqué : Boolean
& nbsp & nbsp public
& ! & ! & ! & nbsp Constructeur Créer(UniqueName : string
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp MaximumInstances : Integer) virtual
& ! & ! & ! & nbsp destructeur Détruire remplacer
& ! & ! & ! & nbsp fonction Serrure(aTimeoutMilliseconds : DWord) : Boolean
& ! & ! & ! & nbsp procédure Déverrouiller
& ! & ! & ! & nbsp propriétés Verrouillé: Boolean lire Affluent
& nbsp & nbsp fin
application
{ TSemaphore }
constructeur TSemaphore.Créer(UniqueName: String
& nbsp & nbsp MaximumInstances: Entier)
begin
& nbsp & nbsp hérité de Créer
& nbsp & nbsp Floqué := False
& nbsp & nbsp HSemaphore := 0
& nbsp & nbsp HSemaphore := CreateSemaphore(nil,MaximumInstances,MaximumInstances,PChar(UniqueName))
& nbsp & nbsp si HSemaphore = 0, alors
& ! & ! & ! & nbsp élever ESemaphoreError.Créer(cSemaphoreCannotCreate)
fin
destructeur TSemaphore.Détruire
begin
& nbsp & nbsp Déverrouiller
& nbsp & nbsp hérité
fin
fonction de TSemaphore.De verrouillage(aTimeoutMilliseconds: DWord): Boolean
var
& nbsp & nbsp Res : Entier
begin
& nbsp & nbsp Res := WaitForSingleObject(hSemaphore, aTimeoutMilliseconds)
& nbsp & nbsp Result := (Res [WAIT_ABANDONED, WAIT_OBJECT_0])
& nbsp & nbsp si le Résultat ensuite Afflué := True
fin
procédure TSemaphore.Déverrouiller
begin
& nbsp & nbsp si ce n'est pas Verrouillée, puis la sortie
& nbsp & nbsp ReleaseSemaphore(hSemaphore,1,nil)
fin
à la fin.
Les semaphores
Les semaphores : Plusieurs milliers de conseils pour vous faciliter la vie.
Tandis qu'un Mutex peut etre utilise pour permettre a une seule instance de votre application, un Semaphore peut etre utilise pour permettre a un nombre specifique.
la Creation de semaphores
Un Semaphore est cree a l'aide de la windows CreateSemaphore commande de l'API.
POIGNEE CreateSemaphore(
& nbsp & nbsp LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,// les attributs de securite
& nbsp & nbsp LONG lInitialCount,// comptage initial
& nbsp & nbsp LONG lMaximumCount,// nombre maximal
& nbsp & nbsp LPCTSTR lpName // pointeur vers le semaphore-nom de l'objet
)
Exemple
HSemaphore := CreateSemaphore(nil, MaximumInstances,
& nbsp & nbsp MaximumInstances,PChar(UniqueName))
nom Unique doit etre un Windows a l'echelle de l'identificateur unique, je recommande que vous utilisez le nom de la Societe.Le nom du produit, ou meme un GUID (Appuyez sur CTRL MAJ G pour generer un GUID au moment de la conception).
Voici une classe wrapper pour un Semaphore, creer une instance de la classe et de l'utiliser de VERROUILLAGE a utiliser une place reservee et Deverrouiller pour le liberer.
unite les Semaphores
interface
& nbsp & nbsp Windows, SysUtils
const
& nbsp & nbsp cSemaphoreCannotCreate = 'Impossible de creer le semaphore'
type
& nbsp & nbsp ESemaphoreError = class(Exception)
& nbsp & nbsp TSemaphore = class
& nbsp & nbsp prive
& ! & ! & ! & nbsp HSemaphore : THandle
& ! & ! & ! & nbsp Floque : Boolean
& nbsp & nbsp public
& ! & ! & ! & nbsp Constructeur Creer(UniqueName : string
& ! & ! & ! & ! & ! & ! & ! & ! & nbsp MaximumInstances : Integer) virtual
& ! & ! & ! & nbsp destructeur Detruire remplacer
& ! & ! & ! & nbsp fonction Serrure(aTimeoutMilliseconds : DWord) : Boolean
& ! & ! & ! & nbsp procedure Deverrouiller
& ! & ! & ! & nbsp proprietes Verrouille: Boolean lire Affluent
& nbsp & nbsp fin
application
{ TSemaphore }
constructeur TSemaphore.Creer(UniqueName: String
& nbsp & nbsp MaximumInstances: Entier)
begin
& nbsp & nbsp herite de Creer
& nbsp & nbsp Floque := False
& nbsp & nbsp HSemaphore := 0
& nbsp & nbsp HSemaphore := CreateSemaphore(nil,MaximumInstances,MaximumInstances,PChar(UniqueName))
& nbsp & nbsp si HSemaphore = 0, alors
& ! & ! & ! & nbsp elever ESemaphoreError.Creer(cSemaphoreCannotCreate)
fin
destructeur TSemaphore.Detruire
begin
& nbsp & nbsp Deverrouiller
& nbsp & nbsp herite
fin
fonction de TSemaphore.De verrouillage(aTimeoutMilliseconds: DWord): Boolean
var
& nbsp & nbsp Res : Entier
begin
& nbsp & nbsp Res := WaitForSingleObject(hSemaphore, aTimeoutMilliseconds)
& nbsp & nbsp Result := (Res [WAIT_ABANDONED, WAIT_OBJECT_0])
& nbsp & nbsp si le Resultat ensuite Afflue := True
fin
procedure TSemaphore.Deverrouiller
begin
& nbsp & nbsp si ce n'est pas Verrouillee, puis la sortie
& nbsp & nbsp ReleaseSemaphore(hSemaphore,1,nil)
fin
a la fin.