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++Builder Discussion :

Problème sur mémoire partagée et mutex


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Masmeta
    Homme Profil pro
    Ing. R&D informatique industrielle
    Inscrit en
    Mai 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ing. R&D informatique industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 472
    Par défaut Problème sur mémoire partagée et mutex
    Bonjour,

    J'utilise une mémoire partagée et un mutex pour la synchronisation d'accès entre 2 applications.

    Voici le code de déclaration sur les 2 applications :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ReadMemory = new MemoryMapping("TESTCom",sizeof(ShareReadMemory));
            ReadMemory->Execute();
            ShareReadMemory = (Struct_ReadMemory*)ReadMemory->PtrMapping;
            ReadMemory->CloseAccessMemory();
     
     hMutex = CreateMutex(NULL,FALSE,"hMutex");
            if (GetLastError() == ERROR_ALREADY_EXISTS)
            {
                if (hMutex !=NULL)
                     CloseHandle(hMutex);
            }
    J'utilise la classe gestion de mémoire partagée développée dans ce tutoriel , je l'ai modifié pour utilisé une structure.

    J'ai réussi à mettre en oeuvre cette classe dans une petite application qui était un simple compteur. Je partageais dans une structure : 1 entier, 1 booléen, et un tableau de long de 10 éléments. La déclaration de ma mémoire partagée et de mon mutex sont identique que le code ci-dessus. Cela fonctionne très bien la mémoire partagée et le mutex ont leur adresses identiques dans les 2 applications.

    Maintenant dans l'application actuelle, je dois partagé 10 entiers, 4 booléens et 3 tableaux de long de 255 éléments. Malheureusement, ni mon mutex, ni l'adresse de la mémoire partagée sont correctes dans les 2 applications. Les 2 adresses sont différentes entre les 2 applications.

    Avez vous une solution ou un début d'explication car je seche un peu?
    Cordialement,

  2. #2
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Par défaut
    Hello,

    Pour ton mutex, c'est normal. Le hMutex que tu récupères est un handle local à ton appli, et il représente une ressource globale. Donc dans ton appli, tu joues avec ton handle, sans t'occuper de ce qu'ont les autres.
    Pour la mémoire partagée ça doit être la même chose.
    Par contre, ne détruis pas ton hMutex si il existe déjà ! Tu perds tout l'intérêt de la chose ! Teste GetLastError() uniquement si hMutex == NULL.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      hMutex = CreateMutex(NULL,FALSE,"hMutex");
      if (hMutex == NULL)
      {
        // GetLastError() ???
      }
      else
      {
        // OK
      }
    MSDN:
    If the function succeeds, the return value is a handle to the newly created mutex object.

    If the function fails, the return value is NULL. To get extended error information, call GetLastError.

    If the mutex is a named mutex and the object existed before this function call, the return value is a handle to the existing object, GetLastError returns ERROR_ALREADY_EXISTS, bInitialOwner is ignored, and the calling thread is not granted ownership. However, if the caller has limited access rights, the function will fail with ERROR_ACCESS_DENIED and the caller should use the OpenMutex function.

  3. #3
    Membre éclairé Avatar de Masmeta
    Homme Profil pro
    Ing. R&D informatique industrielle
    Inscrit en
    Mai 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ing. R&D informatique industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 472
    Par défaut
    Citation Envoyé par totoche76 Voir le message
    Pour la mémoire partagée ça doit être la même chose.
    Je me suis mal exprimé je parlais du pointeur de retour pour la zone mémoire.
    Cependant j'ai remarqué sur l'application compteur que l'adresse du handle du mutex était la même pour les deux applications. C'est peut être une coincidence.

    J'ai testé ton conseil, mais cela ne fonctionne toujours.
    Je continue la recherche

  4. #4
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Par défaut
    Qu'est ce qui ne fonctionne pas en fait ? Tu reçois un message d'erreur ?

    Est-ce que tu peux poster un peu plus de code ?

  5. #5
    Membre éclairé Avatar de Masmeta
    Homme Profil pro
    Ing. R&D informatique industrielle
    Inscrit en
    Mai 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ing. R&D informatique industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 472
    Par défaut
    Tout fonctionne correctement, il y avait juste 2 coquilles dans code.
    J'avais inversée 2 variables. Ce qui fait que je ne lisais pas les bonnes valeurs.
    erf !!!

    Je vais éviter de rester trop devant l'écran ce soir .

    Merci de ton aide.

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

Discussions similaires

  1. WSS problème sur document partagé
    Par gikose dans le forum SharePoint
    Réponses: 9
    Dernier message: 30/01/2009, 10h22
  2. Réponses: 15
    Dernier message: 04/06/2007, 01h53
  3. Réponses: 2
    Dernier message: 05/05/2007, 16h57
  4. Réponses: 6
    Dernier message: 27/03/2007, 08h23
  5. Problème unlink() sur dossier partagé Linux
    Par Ethylene dans le forum Langage
    Réponses: 1
    Dernier message: 25/01/2007, 10h48

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