Compter instance d'une application

Résolu
Messages postés
138
Date d'inscription
mardi 24 décembre 2002
Statut
Membre
Dernière intervention
19 août 2021
-
Messages postés
138
Date d'inscription
mardi 24 décembre 2002
Statut
Membre
Dernière intervention
19 août 2021
-
Bonjour,
Je dois autoriser que 2 lancements d'un EXE et si ils sont ouvert tous les deux
ils doivent avoir Application.Title different.

J'ai toujours la possibilité de faire 2 EXE : Project1.exe et Project2.exe
et via un createMutex different dans chaque exe gerer le truc.

Mais chaque fois que je fais une modif de code je dois recompiler le Project2.exe à cause du DPR different du Project1.exe
Donc voila je me suis tenter à faire qu'un simple EXE avec dans le DPR:
//------------- Project1.dpr ---------------------------------
Setlasterror(NO_ERROR);
Createmutex(nil, False, 'Project1');
if Getlasterror = ERROR_ALREADY_EXISTS then
begin
Application.Initialize;
Application.Title := 'Instance2';
end else
begin
Application.Initialize;
Application.Title := 'Instance1';
end;
Application.CreateForm(TForm1, Form1);
Application.Run;
//-----------------------------------------------------------
Mais naturellement je n'ai plus de limite on peut le lancer plus deux fois
Je pense que je dois pouvoir compter le nombre en mémoire 1 ou 2 si 2 Exit
Y aurait'il pas une solution plus courte par l'intermediaire du Title de l'application.

Beau Temps, Belle Mer
Georgio.

4 réponses

Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
18
Bonsoir,

Il y a peut-être plus simple, mais ça fonctionne chez moi :

program Project1;

uses
  Forms,SysUtils,Windows,Dialogs,
  Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
const NbreProcess : Integer = 2; //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 := OpenSemaphor(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.Tag := Count + 1; //Pour le caption de Form1.
  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.


Et pour le caption de la Form :

implementation
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
  begin
  Form1.Caption := 'Instance ' + IntToStr(Application.Tag);
end;

end.



N.B. :
Sous D7,
Application.Title := 'Instance1';
ne change pas le Caption de la Form...



_______________________________________
Soutenez Wikimédia France aujourd'hui : http://dons.wikimedia.fr
Messages postés
138
Date d'inscription
mardi 24 décembre 2002
Statut
Membre
Dernière intervention
19 août 2021

Bonjour,

Merci de ta réponse Caribensila. C'est sur que présenter comme tu l'a fait les choses paraissent évidemment beaucoup plus simple.

Moi je me voyais déjà en train de lister tous les processus et les compter un par un, et toi tu arrives et tu me donne la solution toute prête sur un plateau, j'ai juste à mettre un ?e? à HdleSem := CreateSemaphore (lol)

Beau Temps Belle Mer
Georgio
Messages postés
2106
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5
Salut Eli42,

tu as aussi dans mon pack de compos le TcyAppInstances. Pour communiquer, tu as le TcyCommRoomConnector + TcyCommunicate.

A+

Pack de compos:
Composants Cindy pour Delphi
Messages postés
138
Date d'inscription
mardi 24 décembre 2002
Statut
Membre
Dernière intervention
19 août 2021

Bonjour,

Pour l'instant j'ai mis en application le code de Caribensila
Mais je jetterais un oeil à ton compo

Encore merci à vous deux

Beau Temps Belle Mer
Georgio