TSemaphore - Exemples

TSemaphore = class (TObject)Interface de TSemaphoreExemples de TSemaphore
uses System.Net, System.IO.Semaphore;
const cSemaphore := 'C:\Semaphores\APIWP.lock';
const cMotif := 'Protection contre réentrance WebProcess';

// On définit le sémaphore
var semaphore:=TSemaphore.Create(cSemaphore, cMotif);

// On réserve l'accès à une ressource partagée via ce sémaphore
var err := semaphore.tryEnter;
if err='' then begin
   try
      // code protégé par le sémaphore  ici
   finally
      semaphore.Leave;
   end;
end else begin
   WebResponse.SetStatusPlainText(503, err);
   Exit;
end;
 
// Exemple : interrogation d'un ERP qui n'autorise qu'un seul accès simultané
// => on définit un sémaphore qu'on devra prendre avant de se connecter à l'ERP

uses System.IO.Semaphore;

var semaphoreERP := 'C:\Semaphores\ERP.lock';
var motif := 'Déclaration production OF 1234';

// On définit le sémaphore
var semaphore:=TSemaphore.Create(semaphoreERP, motif);

// On réserve l'accès à une ressource partagée via ce sémaphore
try
   semaphore.Enter(5000);
except
   on e: Exception do begin
      // Si on n'arrive pas à le réserver, on traite l'exception en indiquant
      // le motif si le sémaphore est déjà réservé
      var lock:=semaphore.CurrentLock;
      if lock<>'' then
         PrintLn('Already locked: '+lock)
      else
         PrintLn('Error: '+e.Message);
      raise;
   end;
end;
try

// On fait des traitements sur la ressource réservée
// ...
finally
// On libère le sémaphore
   semaphore.Leave;
end;

// Le script se poursuit, tandis que d'autres process peuvent de nouveau accéder
// à la ressource précédemment réservée
// ...