Compter instance d'une application [Résolu]

cs_eli42 116 Messages postés mardi 24 décembre 2002Date d'inscription 30 juillet 2018 Dernière intervention - 19 mars 2011 à 17:42 - Dernière réponse : cs_eli42 116 Messages postés mardi 24 décembre 2002Date d'inscription 30 juillet 2018 Dernière intervention
- 23 mars 2011 à 16:30
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.
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention - 19 mars 2011 à 20:03
3
Merci
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

Merci Caribensila 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 72 internautes ce mois-ci

Commenter la réponse de Caribensila
Meilleure réponse
cs_eli42 116 Messages postés mardi 24 décembre 2002Date d'inscription 30 juillet 2018 Dernière intervention - 20 mars 2011 à 10:55
3
Merci
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

Merci cs_eli42 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 72 internautes ce mois-ci

Commenter la réponse de cs_eli42
Meilleure réponse
cs_MAURICIO 2233 Messages postés mardi 10 décembre 2002Date d'inscription 15 décembre 2014 Dernière intervention - 21 mars 2011 à 10:22
3
Merci
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

Merci cs_MAURICIO 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 72 internautes ce mois-ci

Commenter la réponse de cs_MAURICIO
Meilleure réponse
cs_eli42 116 Messages postés mardi 24 décembre 2002Date d'inscription 30 juillet 2018 Dernière intervention - 23 mars 2011 à 16:30
3
Merci
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

Merci cs_eli42 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 72 internautes ce mois-ci

Commenter la réponse de cs_eli42

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.