Processus doublé

Signaler
Messages postés
255
Date d'inscription
samedi 20 avril 2002
Statut
Membre
Dernière intervention
16 janvier 2007
-
Messages postés
255
Date d'inscription
samedi 20 avril 2002
Statut
Membre
Dernière intervention
16 janvier 2007
-
Salut à tous.
Comment peut on faire pour qu'un processus ou une application ne soit exécuté deux fois en même temps. Celle-ci doit comprendre qu'il faut 'tuer' un processus de nom identique. Merci ++

4 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
Faisons le cas le + simple, tu as une fenetre principale dans ton prog. On enregistre son handle dans une section 'shared' et on verifie a l'ouverture si est != 0.

#pragma data_seg("Shared")
HWND g_hPrev = 0;
#pragma data_seg()
#pragma comment(linker, "/section:Shared,rws")

BOOL IsAnotherProcess()
{
if(!IsWindow(g_hPrev)) return 0;
HWND hChild = GetLastActivePopup(g_hPrev);
if(IsIconic(hChild)) ShowWindow(hChild, SW_RESTORE);
SetForegroundWindow(hChild);
return 1;
}

dans WM_INITDIALOG ou WM_CREATE:
g_hPrev = hwnd;

dans WinMain tout au debut:
if(IsAnotherProcess()) return 0;
ainsi 1 seule instance du prog tournera si c'est bien le meme exe a la meme place qui est relance. Si par contre tu veux fermer ancienne instance alors sera encore plus simple, te suffira de poster un WM_CLOSE.
---------------------------

Pour exe qui pourrait etre recopie a plusieurs endroits, c'est plus complique. Le mieux a mon avis est d'occuper un espace dans le fichier d'echange en faisant un appel CreateFileMapping avec un nom arbitraire, tu reserves la quantite voulue et tu y ranges le hprocess ou ce que tu veux, chaque instance du prog qui demarre verifie si ce filemap existe (OpenFileMapping) et traite en consequence.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
dans mon exemple de "distance parcourrue avec la souris", j'utilise un objet global système Mutex pour vérifier qu'une seule instance du prog tourne.

la première instance crée l'objet et les autres vérifient son existence avant de poursuivre.
Messages postés
241
Date d'inscription
mardi 29 octobre 2002
Statut
Membre
Dernière intervention
23 janvier 2006

Les reponses precedentes concernant windows, je te donne un element de reponse concernant Linux.
Le systeme le plus con et le plus "unixien" est d utiliser un simple fichier verrouille en ecriture toute la duree d execution du programme, et le programme tente d ecrire dans ce fichier au demarrage. SI ce n est pas possible, il quitte. Ce systeme est beaucoup utilise pour les demons, et les fichiers de verrouillage se trouvent dans /tmp/lock en general.

Sinon si il s agit d un programme que tu n as pas ecrit toit meme, alors regarde du cote des sources de killall (ou sinon fait un system("killall nom_du_processus");
Messages postés
255
Date d'inscription
samedi 20 avril 2002
Statut
Membre
Dernière intervention
16 janvier 2007

Merci à tous pour vos commentaires édifiants et ++