N'autoriser que 'n' instances de l'application

Contenu du snippet

Ce code est logiquement placé dans le source du projet afin qu'il soit exécuté avant même la création de la Form. Mais il pourrait être placé dans le FormCreate.

program Project1;

uses
  SysUtils,Windows,Dialogs,Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}


const NbreProcess : Integer = 3; //Nbre maxi de processus autorisés.
        SEMAPHORE_ALL_ACCESS  = EVENT_ALL_ACCESS;

var   HdleSem : THandle; //Handle du Sémaphore.
       Count     : Integer;   //Nbre d'accès au Sémaphore dejà utilisés.


begin
HdleSem := OpenSemaphore(SEMAPHORE_ALL_ACCESS,true,'NomSem');//On essaie d'ouvrir le sémaphore.
if HdleSem=0 then begin //Si pas encore créé, c'est donc la 1ère instance et..
  HdleSem := CreateSemaphore(nil,0,NbreProcess,'NomSem'); //..on le crée.
  if HdleSem = 0 then begin //Si échec de la création..
    ShowMessage('Erreur d''ouverture du sémaphore !') ;
    Halt; //..on quitte.
  end ;
end;

if not(releaseSemaphore(HdleSem,1,@count)) then begin //Si l'ajout d'un nouvel accès au Sémaphore échoue..
  ShowMessage('Pas plus de ' + IntToStr(NbreProcess) + ' processus !'); //.. c'est que le nombre maxi est atteint et..
  Halt;      //..on quitte..
  end ;

  Application.Initialize;   //..sinon la limitation n'est pas atteinte et on continue.
  Application.CreateForm(TForm1, Form1);
  Application.Run;
  {Fonction d'attente qui décrémente le compteur du Sémaphore quand on supprime un des process.}
  WaitForSingleObject(HdleSem,0) ;
END.



Compatibilité : Delphi 5

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.