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

API, COM et SDKs Delphi Discussion :

Problème de Mutex


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2006
    Messages : 147
    Par défaut Problème de Mutex
    Bonjour,

    Voilà, j'ai un exécutable P1 et un exécutable P2 chargeant une DLL.

    Je souhaite indiquer à la DLL qu'elle doit se décharger. Pour ce faire, je crée un Mutex dans P1.

    Régulièrement, le code de la DLL chargée par P2 vérifie l'existence du Mutex créé par P1. Si le Mutex existe, la DLL se décharge de P2.

    Dans P1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vh_Mutex := CreateMutex(nil, True, MutexStopDll);
    Dans la DLL de P2, à intervalle régulier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    vh_Mutex := CreateMutex(nil, True, MutexStopDll);
        if vh_Mutex = 0 then Begin
          trace(gc_process + MutexStopDll, 'Mutex ' + MutexStopDll + ' pas créé => Running');
          gl_quit := True;
        End
        else begin
          trace(gc_process + MutexStopDll, 'Mutex ' + MutexStopDll + ' créé => PAS Running');
          CloseHandle(vh_Mutex);
        end;
    Et bien ce code ne fonctionne pas. J'utilise les Mutex depuis 10 ans, et la nada. La seule particularité est que le code essayant qui tente la création du Mutex est dans une DLL, et qu'elle y parvient alors que P1 a déjà créé le Mutex. Je n'y comprends absolument rien.

    Une idée ?

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 018
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 018
    Par défaut
    J'ai utilisé le Mutex dans un Objet OLE sous soucis récemment !
    A la différence que j'ai mis False au paramètre bInitialOwner de CreateMutex

    tu n'as pas oublié de tester si GetLastError() est égale à ERROR_ALREADY_EXISTS lorsqu'il te renvoie une valeur positive ?
    10 ans ? Tu n'y as rien compris ?
    C'est tout l'intéret d'avoir un Mutex commun à deux processus pour créer une section critique avec WaitForSingleObject et ReleaseMutex


    Return Values

    If the function succeeds, the return value is a handle to the mutex object. If the named mutex object existed before the function call, the GetLastError function returns ERROR_ALREADY_EXISTS. Otherwise, GetLastError returns zero.
    If the function fails, the return value is NULL. To get extended error information, call GetLastError.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2006
    Messages : 147
    Par défaut
    Pour moi, le CreateMutex (nil, TRUE, MutexName) ne renvoie de handle valide (non nul) que si le Mutex n'a pas déjà été créé par un autre processus. Si on veux accéder à un Mutex existant, il faut utiliser effectivement OpenMutex. Non ???

    En testant le GetLastError, je m'en sors, mais je ne comprend pas comment on peut faire 2 CreateMutex (nil, TRUE, MutexName) en même temps dans 2 processus différents et récupérer 2 handles différents

    Si c'est possible, et visiblement oui, non, je n'ai rien compris...

  4. #4
    Membre très actif
    Homme Profil pro
    Santé
    Inscrit en
    Septembre 2010
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Santé
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2010
    Messages : 290
    Par défaut
    Salut,

    Two or more processes can call CreateMutex to create the same named mutex. The first process actually creates the mutex, and subsequent processes open a handle to the existing mutex. This enables multiple processes to get handles of the same mutex, while relieving the user of the responsibility of ensuring that the creating process is started first. When using this technique, you should set the bInitialOwner flag to FALSE; otherwise, it can be difficult to be certain which process has initial ownership.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2006
    Messages : 147
    Par défaut
    En fait j'utilise le même code depuis des années sans me poser de question. Dans cette nouvelle application, j'ai encore utilisé ce code. Mais... dans mon copier-coller, le test du GetLastError est passé à la trappe Mon code original l'utilise.

    Donc effectivement, il faut bien faire un GetLastError...

    Merci pour vos réponses.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de mutex en mode release
    Par fredppp dans le forum C++/CLI
    Réponses: 3
    Dernier message: 05/11/2010, 20h26
  2. [Protection de données] Problème de mutex
    Par DSGSLA dans le forum Multithreading
    Réponses: 11
    Dernier message: 04/02/2010, 16h34
  3. problème de mutex et de condition
    Par mitmat dans le forum SDL
    Réponses: 4
    Dernier message: 03/04/2008, 17h25
  4. problème de mutex
    Par ep31 dans le forum MFC
    Réponses: 2
    Dernier message: 07/04/2006, 11h28
  5. Problème de mutex avec Waitforsingleobject non-bloquant
    Par rvzip64 dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 03/11/2005, 11h02

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