cs_eli42
Messages postés143Date d'inscriptionmardi 24 décembre 2002StatutMembreDernière intervention11 juillet 2023
-
19 mars 2011 à 17:42
cs_eli42
Messages postés143Date d'inscriptionmardi 24 décembre 2002StatutMembreDernière intervention11 juillet 2023
-
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.
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 19 mars 2011 à 20:03
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.
cs_eli42
Messages postés143Date d'inscriptionmardi 24 décembre 2002StatutMembreDernière intervention11 juillet 20231 20 mars 2011 à 10:55
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)