Bonjour,
je vais tâcher d'être suffisemment clair afin d'exposer mon problème en vue de trouver uen solution.
Voilà, j'ai un souci avec l'execution multiple de code depuis des applications (EXE) dffférents sous windows.
1/ une libraire statique (SYSTEM.LIB) contient une routine "message.c" pouvant afficher un message à l'écran selon les conditions d'executions et de résultats antérieurs.
2/ une seconde libriarie statique (ROUTINE.LIB) contient une une routine "appel.c" qui dans son exécution fait appel à la routine "message.c".
3/ l'appel à la routine "message.c". se fait dans un thread de la façon suivante :
4/ Quatre EXE différents (A.exe, B.exe, C.exe et D.exe), linkés avec ces 2 libraires sont susceptibles de faire afficher ce message, donc d'appeler la routine "appel.c". les 4 EXE tournent en même temps et effectuent périodiquement différents calculs.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 // creation du thread hthread_rcv=CreateThread ( NULL, 0, (LPTHREAD_START_ROUTINE)message, (LPVOID)pointer, 0, &threadID_rcv ); // ferme le handle CloseHandle(hthread_rcv);
5/ une fois les conditions remplies pour faire afficher le message par l'un des 4 EXE, le message est affiché (exemple A.exe va être à l'origine des conditions), un thread est créé dans l'EXE appelant (A.exe), ainsi que des USER objects et des GDI objects.
6/ dans la routine "message.c", je vais vérifier que si le message est affiché, je n'en affiche pas un autre, en utilisant le code suivant :
7/ maintenat si les conditions d'affichage du message pour une autre EXE sont remplies elles aussi (exemple pour C.exe), un nouveau message est affiché, avec un un thread est créé dans l'EXE appelant (C.exe), ainsi que des USER objects et des GDI objects.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 LPCSTR Wname="message"; HANDLE hMutex; // si l'instance existe déjà hMutex = CreateMutex(NULL, FALSE,Wname); if ( GetLastError() == ( ERROR_ALREADY_EXISTS || ERROR_ACCESS_DENIED ) ) { // ferme le handle créé if (hMutex) CloseHandle(hMutex); // on s'en va return; }
==> le problème se situe là : je pensais que le code du point 6/ allait empêcher ce nouveau message d'être affiché, mais non.
d'où ma question : comment faire pour n'avoir plus qu'un seul message affiché, et avoir la possibilité, pour n'importe quel EXE de faire fermer ce message, qui aurait pu être ouvert pour un autre EXE ?
Merci beaucoup par avance de votre aide,
Thierry
Partager