Processus doublé

cs_Stormy Messages postés 255 Date d'inscription samedi 20 avril 2002 Statut Membre Dernière intervention 16 janvier 2007 - 23 juin 2004 à 23:36
cs_Stormy Messages postés 255 Date d'inscription samedi 20 avril 2002 Statut Membre Dernière intervention 16 janvier 2007 - 24 juin 2004 à 22:37
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

BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
24 juin 2004 à 01:04
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++
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
24 juin 2004 à 13:24
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.
0
MetalDwarf Messages postés 241 Date d'inscription mardi 29 octobre 2002 Statut Membre Dernière intervention 23 janvier 2006
24 juin 2004 à 15:31
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");
0
cs_Stormy Messages postés 255 Date d'inscription samedi 20 avril 2002 Statut Membre Dernière intervention 16 janvier 2007
24 juin 2004 à 22:37
Merci à tous pour vos commentaires édifiants et ++
0
Rejoignez-nous