Lors de l'écriture d'applications multithread, la chose la plus importante est de contrôler l'accès synchronisé aux ressources entre les threads pour garantir le fonctionnement sécurisé des threads. L'API Win 32 fournit un ensemble d'objets de synchronisation, tels que Sémaphore, Mutex, Section Critique, Événement, etc., pour résoudre ce problème.
Delphi encapsule les objets événement et les objets section critique respectivement dans les objets Tevent et les objets TcriticalSection, ce qui rend l'utilisation de ces deux objets simple et pratique. Cependant, si vous souhaitez utiliser des objets tels que des sémaphores ou des mutex dans un programme Delphi, vous devez recourir à des fonctions API Win32 complexes, ce qui est très gênant pour les programmeurs qui ne sont pas familiers avec les fonctions API Win32. Par conséquent, l'auteur a utilisé Delphi pour construire deux classes pour encapsuler les objets sémaphore et mutex (respectivement TSemaphore et TMutex), dans l'espoir d'être utile à la majorité des programmeurs Delphi.
1. Structure des classes
Nous faisons d’abord abstraction de l’objet sémaphore et de l’objet mutex de l’API Win32, construisons une classe parent THandleObjectEx, puis dérivons deux sous-classes Tsemphore et Tmutex de cette classe parent.
Le code source de la classe est le suivant :
unité SyncobjsEx ;
interface
utilise Windows, Messages, SysUtils, Classes, Syncobjs ;
taper
THandleObjectEx = classe (THandleObject)
// THandleObjectEx est la classe parent de la classe d'exclusion mutuelle et de la classe sémaphore
Protégé
FPoignée : TPoignée ;
FLastError : entier ;
publique
destructeur Détruire ;
procédure Libération; remplacement;
fonction WaitFor(Timeout : DWord) : TWaitResult ;
propriété LastError : Entier lu FLastError ;
propriété Handle : THandle read FHandle ;
fin;
TMutex = class(THandleObjectEx)//Classe mutuellement exclusive
publique
constructeur Create (MutexAttributes : PSecurityAttributes ; InitialOwner : Boolean ; const Name : string);
procédure Libération ; remplacement ;
fin;
TSémaphore = classe (THandleObjectEx)
//Classe de feux de signalisation
publique
constructeur Create (SemaphoreAttributes : PSecurityAttributes ; InitialCount : Integer ; MaximumCount : entier ; const Name : string);
procédure Release (ReleaseCount: Integer = 1; PreviousCount: Pointer = nil surcharge);