Bonjour, j'écris un petit programme, et je voudrai qu'on ne puisse lancer que n (pour l'instant n=2) instances de ce programme simultanément. Je pense utiliser des sémaphores pour ceci.
Voici comment je pense devoir procéder:
1) Au lancement du programe, j'essaie d'ouvrir un sémaphore. Si l'ouverture ne marche pas cela signifie que le sémaphore n'as pas encore été crée, et donc que c'est la première instance du programme qui tourne. je crée donc le sémaphore.
2) Je fais un WaitForSingleObject avec un timeout de 0, et si la valeur retournée est un WAIT_OBJECT_0 je continue, si c'est WAIT_TIMEOUT, je quitte le programme.
pour l'instant, je me contente d'afficher le resultat du WaitForSingleObject afin de voir si tout se passe comme je le prévoyait (et vous avez déja deviné que ce n'est pas le cas)
Remarque: le DEBUG_MESSAGE est une macro qui fait un printf en mode debug et qui ne fait rien en mode release.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 HANDLE Semaphore; //ouverture ou création du sémaphore: if((Semaphore=OpenSemaphore(SEMAPHORE_MODIFY_STATE,FALSE,"mySemaphore"))==NULL) { if((Semaphore=CreateSemaphore(NULL,2,2,"mySemaphore"))==NULL) { DEBUG_MESSAGE("Impossible de creer le semaphore\n") return INITIALISATION_ERROR; } else { DEBUG_MESSAGE("Semaphore created\n") } } else { DEBUG_MESSAGE("Semaphore opened\n") } //verification de l'etat du semaphore et affichage du résultat: DWORD result=WaitForSingleObject(Semaphore,0); switch(result) { case WAIT_ABANDONED: DEBUG_MESSAGE("wait abandoned\n") break; case WAIT_OBJECT_0: DEBUG_MESSAGE("wait object 0\n") break; case WAIT_TIMEOUT: DEBUG_MESSAGE("wait timeout\n") break; case WAIT_FAILED: DEBUG_MESSAGE("wait failed\n") break; default: DEBUG_MESSAGE("ce texte ne devrait jamais apparaitre\n") }
Lorsque je lance la première instance de mon programme, il affiche:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 #ifdef _DEBUG #define DEBUG_MESSAGE(tEXT) {printf(tEXT);} #else #define DEBUG_MESSAGE(tEXT) {} #endif
Semaphore created
wait object 0
Mais lorsque je lance la deuxième instance, il affiche:
Semaphore opened
wait failed
Moi je m'attendais a avoir:
--1ere instance:
Semaphore created
wait object 0
--2eme instance:
Semaphore opened
wait object 0
--3eme instance:
Semaphore opened
wait timeout
qqun peut-il m'aider?
merci d'avance
Partager