IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problème avec un appel multiple d'une routine depuis différents EXE


Sujet :

C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 32
    Points : 25
    Points
    25
    Par défaut Problème avec un appel multiple d'une routine depuis différents EXE
    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 :

    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);
    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.

    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 :

    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; 
    	}
    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.

    ==> 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

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Inclus l'ID du processus (ou du thread) appelant dans le nom du mutex.

    Aussi, retire ce cast en (LPTHREAD_STARD_ROUTINE). Les casts de pointeurs de fonction sont à bannir. Si ça ne compile pas, regarde ma signature.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 32
    Points : 25
    Points
    25
    Par défaut
    Merci Médinoc de ta réponse rapide ;

    avant de revenir sur ce que tu écris, j'aimerai faire un rajout d'une modif sur le check fait sur le GetLastError supplémentaire dans mon code qui semble - en partie - avoir résolue une partie de mon souci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	DWORD _CrMuError;	// 
     
    	// si l'instance existe déjà
    	hMutex = CreateMutex(NULL, FALSE,Wname);
    	_CrMuError = GetLastError();
    	if ( (_CrMuError /*GetLastError()*/ == (DWORD)ERROR_ALREADY_EXISTS ) 
    		|| (_CrMuError /*GetLastError()*/ == (DWORD)ERROR_ACCESS_DENIED ) )
    je dis "semble", car plus loin dans mon code de "message.c" j'ai d'autre vérifications qui ne vont pas non plus ; en gros, une variable globale définie dans cette routine qui semble bien n'être mise à jour qu'à travers l'appel d'exécution du message ; en gros, "message.c" est construit de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // variable globale
    static BOOL enroute;	// Flags
     
    // procédure pour gérer le message et son contenu (enroute sera mis à jour dans cette procédure)
    LRESULT CALLBACK WndPro(HWND hwnd,UINT msg,WPARAM wParam, LPARAM lParam)
     
    // Mon main (enroute sera vérifié dans cette fonction qui contient aussi le check avec le CreateMutex)
    void shsys_counter(LPVOID param)
    Je pense donc qu'il faut que je définisse enroute autrement et/ou ailleurs.... mais comment ?

    Sinon, pour revenir sur ta remarque : je vais faire ce que tu me dit concernant l'ID du processus/thread... faut juste que je trouve comment
    Pour ce qui est le cast, je vais le retirer... merci de l'info.

    Thierry

Discussions similaires

  1. [PHP 4] problème avec l'appel d'une class
    Par sinifer dans le forum Langage
    Réponses: 18
    Dernier message: 31/05/2011, 22h31
  2. Réponses: 2
    Dernier message: 05/02/2009, 09h04
  3. [ImageMagick] Appel d'une image ?
    Par nerazzurri dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 30/09/2007, 12h58
  4. problème avec l'appel d'une fonction
    Par mademoizel dans le forum ASP
    Réponses: 5
    Dernier message: 26/06/2006, 15h04
  5. Problèmes avec des cases à cocher et une liste déroulante
    Par rob2-9 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 25/01/2006, 10h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo