TSemaphore - Exemples
| TSemaphore = class (TObject) | Interface de TSemaphore | Exemples 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;
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
// ...
// => 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
// ...