Al escribir aplicaciones de subprocesos múltiples, lo más importante es controlar el acceso sincronizado a recursos entre subprocesos para garantizar el funcionamiento seguro de los subprocesos. La API de Win 32 proporciona un conjunto de objetos de sincronización, como Semaphore, Mutex, Sección crítica, Evento, etc., para resolver este problema.
Delphi encapsula objetos de evento y objetos de sección crítica en objetos Tevent y objetos TcriticalSection respectivamente, haciendo que el uso de estos dos objetos sea simple y conveniente. Sin embargo, si desea utilizar objetos como semáforos o mutex en un programa Delphi, debe recurrir a funciones complejas de la API de Win32, lo cual es muy inconveniente para los programadores que no están familiarizados con las funciones de la API de Win32. Por lo tanto, el autor utilizó Delphi para construir dos clases para encapsular los objetos semáforo y mutex (TSemaphore y TMutex respectivamente), con la esperanza de ser útiles para la mayoría de los programadores de Delphi.
1. Estructura de clases
Primero abstraemos el objeto semáforo y el objeto mutex de la API de Win32, construimos una clase principal THandleObjectEx y luego derivamos dos subclases Tsemphore y Tmutex de esta clase principal.
El código fuente de la clase es el siguiente:
unidad SyncobjsEx;
interfaz
utiliza Windows, Mensajes, SysUtils, Clases, Syncobjs;
tipo
THandleObjectEx = clase(THandleObject)
// THandleObjectEx es la clase principal de la clase de exclusión mutua y la clase de semáforo
Protegido
Mango F: Mango T;
FLastError: entero;
público
destructor Destruir; anular;
procedimiento Liberación; anulación;
función WaitFor (Tiempo de espera: DWord): TWaitResult;
propiedad LastError:Entero leído FLastError;
identificador de propiedad: THandle lee FHandle;
fin;
TMutex = class(THandleObjectEx)//Clase mutuamente excluyente
público
constructor Create(MutexAttributes: PSecurityAttributes; InitialOwner: Boolean; const Nombre:cadena);
liberación del procedimiento;
fin;
TSemaphore = clase(THandleObjectEx)
//Clase de luz de señal
público
constructor Create(SemaphoreAttributes: PSecurityAttributes;InitialCount:Integer;MaximumCount: entero; const Nombre: cadena);
lanzamiento del procedimiento (ReleaseCount: Integer=1;PreviousCount:Pointer=nil);