Semáforos


Mientras que un Mutex puede utilizarse para permitir que una única instancia de la aplicación, el Semáforo se pueden utilizar para permitir a un número específico.
la Creación de semáforos
Un Semáforo es creado usando el windows CreateSemaphore comando API.
MANEJAR CreateSemaphore(
& nbsp & nbsp LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,// atributos de seguridad
& nbsp & nbsp LARGO lInitialCount,// conteo inicial
& nbsp & nbsp LARGO lMaximumCount,// número máximo
& nbsp & nbsp LPCTSTR lpName // puntero a un semáforo-nombre de objeto
)
Ejemplo
HSemaphore := CreateSemaphore(nil, MaximumInstances,
& nbsp & nbsp MaximumInstances,PChar(UniqueName))
nombre Único debe ser un identificador único, le recomiendo que use CompanyName.ProductName, o incluso un GUID (Presione la tecla CTRL SHIFT + G para generar un GUID en tiempo de diseño).
Aquí es una clase de envoltura de un Semáforo, crear una instancia de la clase y el uso de BLOQUEO para usar un lugar reservado y Desbloqueo para liberarlo.
unidad Semáforos
interfaz
usa
& nbsp & nbsp Windows, SysUtils
const
& nbsp & nbsp cSemaphoreCannotCreate = 'No se puede crear el semáforo'
tipo
& nbsp & nbsp ESemaphoreError = clase(Excepción)
& nbsp & nbsp TSemaphore = clase
& nbsp & nbsp privada
& nbsp & nbsp & nbsp & nbsp HSemaphore : THandle
& nbsp & nbsp & nbsp & nbsp Acudieron : Boolean
& nbsp & nbsp público
& nbsp & nbsp & nbsp & nbsp Constructor Crear(UniqueName : cadena

& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp MaximumInstances : Integer) virtual
& nbsp & nbsp & nbsp & nbsp destructor Destruir reemplazar
& nbsp & nbsp & nbsp & nbsp función Bloqueo(aTimeoutMilliseconds : DWord) : Boolean
& nbsp & nbsp & nbsp & nbsp procedimiento Desbloquear
& nbsp & nbsp & nbsp & nbsp propiedad Bloqueado: Boolean leer Acudieron
& nbsp & nbsp fin
aplicación
{ TSemaphore }
constructor TSemaphore.Crear(UniqueName: String
& nbsp & nbsp MaximumInstances: Integer)
begin
& nbsp & nbsp heredado Crear
& nbsp & nbsp Acudieron := False
& nbsp & nbsp HSemaphore := 0
& nbsp & nbsp HSemaphore := CreateSemaphore(nil,MaximumInstances,MaximumInstances,PChar(UniqueName))
& nbsp & nbsp si HSemaphore = 0, entonces
& nbsp & nbsp & nbsp & nbsp elevar ESemaphoreError.Crear(cSemaphoreCannotCreate)
fin
destructor TSemaphore.Destruir
begin
& nbsp & nbsp Desbloquear
& nbsp & nbsp heredado
fin
función TSemaphore.De bloqueo(aTimeoutMilliseconds: DWord): Boolean
var
& nbsp & nbsp Res : Integer
begin
& nbsp & nbsp Res := WaitForSingleObject(hSemaphore, aTimeoutMilliseconds)
& nbsp & nbsp Resultado := (Res [WAIT_ABANDONED, WAIT_OBJECT_0])
& nbsp & nbsp si el Resultado Acudieron := True
fin
procedimiento TSemaphore.Desbloquear
begin
& nbsp & nbsp si no está Bloqueado, a continuación, salir
& nbsp & nbsp ReleaseSemaphore(hSemaphore,1,nil)
fin
final.









Semaforos


Semaforos : Multi-millones de consejos para hacer su vida mas facil.


Mientras que un Mutex puede utilizarse para permitir que una unica instancia de la aplicacion, el Semaforo se pueden utilizar para permitir a un numero especifico.
la Creacion de semaforos
Un Semaforo es creado usando el windows CreateSemaphore comando API.
MANEJAR CreateSemaphore(
& nbsp & nbsp LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,// atributos de seguridad
& nbsp & nbsp LARGO lInitialCount,// conteo inicial
& nbsp & nbsp LARGO lMaximumCount,// numero maximo
& nbsp & nbsp LPCTSTR lpName // puntero a un semaforo-nombre de objeto
)
Ejemplo
HSemaphore := CreateSemaphore(nil, MaximumInstances,
& nbsp & nbsp MaximumInstances,PChar(UniqueName))
nombre Unico debe ser un identificador unico, le recomiendo que use CompanyName.ProductName, o incluso un GUID (Presione la tecla CTRL SHIFT + G para generar un GUID en tiempo de diseño).
Aqui es una clase de envoltura de un Semaforo, crear una instancia de la clase y el uso de BLOQUEO para usar un lugar reservado y Desbloqueo para liberarlo.
unidad Semaforos
interfaz
usa
& nbsp & nbsp Windows, SysUtils
const
& nbsp & nbsp cSemaphoreCannotCreate = 'No se puede crear el semaforo'
tipo
& nbsp & nbsp ESemaphoreError = clase(Excepcion)
& nbsp & nbsp TSemaphore = clase
& nbsp & nbsp privada
& nbsp & nbsp & nbsp & nbsp HSemaphore : THandle
& nbsp & nbsp & nbsp & nbsp Acudieron : Boolean
& nbsp & nbsp publico
& nbsp & nbsp & nbsp & nbsp Constructor Crear(UniqueName : cadena

& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp MaximumInstances : Integer) virtual
& nbsp & nbsp & nbsp & nbsp destructor Destruir reemplazar
& nbsp & nbsp & nbsp & nbsp funcion Bloqueo(aTimeoutMilliseconds : DWord) : Boolean
& nbsp & nbsp & nbsp & nbsp procedimiento Desbloquear
& nbsp & nbsp & nbsp & nbsp propiedad Bloqueado: Boolean leer Acudieron
& nbsp & nbsp fin
aplicacion
{ TSemaphore }
constructor TSemaphore.Crear(UniqueName: String
& nbsp & nbsp MaximumInstances: Integer)
begin
& nbsp & nbsp heredado Crear
& nbsp & nbsp Acudieron := False
& nbsp & nbsp HSemaphore := 0
& nbsp & nbsp HSemaphore := CreateSemaphore(nil,MaximumInstances,MaximumInstances,PChar(UniqueName))
& nbsp & nbsp si HSemaphore = 0, entonces
& nbsp & nbsp & nbsp & nbsp elevar ESemaphoreError.Crear(cSemaphoreCannotCreate)
fin
destructor TSemaphore.Destruir
begin
& nbsp & nbsp Desbloquear
& nbsp & nbsp heredado
fin
funcion TSemaphore.De bloqueo(aTimeoutMilliseconds: DWord): Boolean
var
& nbsp & nbsp Res : Integer
begin
& nbsp & nbsp Res := WaitForSingleObject(hSemaphore, aTimeoutMilliseconds)
& nbsp & nbsp Resultado := (Res [WAIT_ABANDONED, WAIT_OBJECT_0])
& nbsp & nbsp si el Resultado Acudieron := True
fin
procedimiento TSemaphore.Desbloquear
begin
& nbsp & nbsp si no esta Bloqueado, a continuacion, salir
& nbsp & nbsp ReleaseSemaphore(hSemaphore,1,nil)
fin
final.


Semáforos

Semáforos : Multi-millones de consejos para hacer su vida más fácil.
Recommander aux amis
  • gplus
  • pinterest

Comentario

Dejar un comentario

Clasificación