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

Windows Discussion :

CreateFileMapping - Création d'un singleton pour plusieurs process.


Sujet :

Windows

  1. #1
    Membre éclairé
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Points : 785
    Points
    785
    Par défaut CreateFileMapping - Création d'un singleton pour plusieurs process.
    J'essaie depuis ce matin de créer un singleton qui soit thread-safe, mais qui offrent la possibilité d'être employée à travers plusieurs processus.

    Pour cela, j'utilise CreateFileMapping et MapViewOfFile.

    Mon singleton pour le moment, n'utilise encore rien pour la synchronisation mais ça viendra par après.

    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
        static void create( const std::string & name ) {
            if( !mInstance ) {
                HANDLE hMapFile = CreateFileMapping( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof( T ), name.c_str() );
                if( hMapFile != NULL ) {
                    int last_error = GetLastError();
                    LPVOID ptr( MapViewOfFile( hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, sizeof( T ) ) );
                    if( last_error == ERROR_ALREADY_EXISTS ) {
                        /// On récupère l'adresse pour mInstance
                        mInstance = reinterpret_cast< T * >( ptr );
                        if( !mInstance ) {
                            throw std::runtime_error( "Erreur dans le Singleton " + name );
                        }
                    }
                    else {
                        /// Sinon, on alloue mInstance
                        mInstance = new( ptr ) T();
                    }
                    UnmapViewOfFile(ptr);
                    CloseHandle( hMapFile );
                }
                else {
                    throw std::runtime_error( "Impossible de réaliser le CreateFileMapping" );
                }
            }
        }
    l'argument name contient le nom de la zone mémoire et est préfixé par "Global\"

    Le problème que j'ai, est que quoi que je fasse :p J'obtiens toujours des instances différentes de mon singleton, et étant donné qu'il s'agit de ma pièce maitresse, j'ai un léger problème

    Est-ce quelqu'un aurait une idée ???

    Creating Named Shared Memory => http://msdn2.microsoft.com/en-us/library/aa366551.aspx
    CreateFileMapping => http://msdn2.microsoft.com/en-us/library/aa366537.aspx
    MapViewOfFile => http://msdn2.microsoft.com/en-us/library/aa366761.aspx
    Nul ne peut mieux connaitre la connaissance qu'elle-même.

  2. #2
    Membre éclairé
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Points : 785
    Points
    785
    Par défaut
    Ah oui, :p mon Singleton se trouve dans une DLL et est écrit en C++ ( Borland )
    Nul ne peut mieux connaitre la connaissance qu'elle-même.

  3. #3
    Membre éclairé
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Points : 785
    Points
    785
    Par défaut
    Je pense avoir trouvé mon erreur, j'utilise directement "UnmapViewOfFile" et "CloseHandle"
    Nul ne peut mieux connaitre la connaissance qu'elle-même.

  4. #4
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    salut,

    tout d'abord, je ne sais pas pour ton probleme.

    Par contre j'ai une question : quel avantage y a-t-il a utiliser un singleton plutot qu'une classe purement statique, non instanciable ?

  5. #5
    Membre éclairé
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Points : 785
    Points
    785
    Par défaut
    Si j'ai bien compris le terme " classe purement statique ", alors autant utilisé un namespace avec des fonctions internes.

    Pq un singleton ? Pour essayer de garantir une seule ressource de données pour un ensemble de clients.
    Nul ne peut mieux connaitre la connaissance qu'elle-même.

  6. #6
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Une classe singleton s'appuie sur un modele de conception (design pattern) qui dit : le constructeur est privé. le singleton doit implémenter la méthode getInstance() qui, si l'objet n'existe pas encore, le créé et le renvoie, et si l'objet existe déjà ne fait que le renvoyer. Au passage cette methode est une methode de classe.

    Avant que je découvre l'existance des singletons, je gérais ce genre de besoins d'unicité des ressources par une classe avec un constructeur privé mais sans getInstance(), ne possédant que des variables de classe et des methodes de classe. C'est ça que j'appelle "une classe purement statique, non instanciable". Les variables de classe garantissent par définition cette unicité donc à priori il n'y a aucune différence d'utiliser l'un ou l'autre, ci ce n'est que l'un est reconnu, l'autre non.

  7. #7
    Membre éclairé
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Points : 785
    Points
    785
    Par défaut
    Merci pour la définition du pattern, mais je connaissais déjà :p

    Effectivement, essayer d'avoir une unicité est très dûre. Surtout dans un environnement multi-thread où même le DCL n'est plus la bonne technique pour initialiser un singleton dans un tel environnement.

    De plus, mon petit soucis est que j'essaie d'avoir un Singleton qui soit chargé dans une DLL et que tous les clients qui utilisent cette DLL soient obligé d'employer mon Singleton pour un pool de connexion ( exemple ).

    Maintenant, je me posais la question des composants (D)COM. Est-ce que cela pourrait résoudre ce style de problème ?

    Pour moi, un composant COM est un ensemble d'objet qui peuvent dialoguer avec d'autres éléments, à travers des langages divers ( tels que CORBA mais en local ).

    Y aurait-il plus facilement possibilité de résoudre mon problème ?
    Nul ne peut mieux connaitre la connaissance qu'elle-même.

  8. #8
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    salut,
    est ce que tu as trouvé ?

    C'est marrant, sous Mac cela suffit pour la communication entre threads, mais sous wndows ça semble ne pas fonctionner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    /**
     * @brief Obtient l'instance du compteur
     * @return L'instance du compteur
     */
    Compteur& 
    Compteur::getInstance()
    {
      static Compteur instance_unique_compteur;
      return instance_unique_compteur;
    }

Discussions similaires

  1. [AC-2007] Création d'entete pour plusieurs formulaires
    Par yfchauer dans le forum IHM
    Réponses: 4
    Dernier message: 01/03/2013, 10h30
  2. Réponses: 2
    Dernier message: 24/04/2012, 14h47
  3. Réponses: 0
    Dernier message: 30/03/2010, 12h04
  4. Création requête d'une commande valable pour plusieurs années
    Par leglod dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 09/01/2008, 20h04
  5. Plusieurs instances d'un singleton pour plusieurs modules
    Par zoubidaman dans le forum C++Builder
    Réponses: 10
    Dernier message: 18/11/2005, 02h44

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