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 :

Plusieurs instances d'un singleton pour plusieurs modules


Sujet :

C++Builder

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 311
    Points : 337
    Points
    337
    Par défaut Plusieurs instances d'un singleton pour plusieurs modules
    Bonsoir à tous,

    j'ai le problème suivant: j'ai un paquet .BPL qui contient un singleton. J'utilise ce singleton dans mon application principale .EXE où il fonctionne très bien.

    Mais je l'utilise également via d'autres paquets .BPL. Et j'ai pu remarquer qu'à chaque fois que je demandais l'instance active du singleton, plutôt que de me retourner le pointeur de l'instance déjà créée, il me recréait une autre instance...

    Plutôt problèmatique pour un singleton

    Est-ce qu'il y a des options à activer ou à désactiver pour obtenir ce que j'attends?

    Merci d'avance...

    Mike

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Difficile de te répondre sans voir le code de ton singleton.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 311
    Points : 337
    Points
    337
    Par défaut
    Voici d'abord le template Singleton
    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
    27
    28
    template <class T>
    class Singleton
    {
    public :
     
            static T* getInstance()
            {
            if (!instance) instance = new T;
            return instance;
            }
     
            static void Release()
            {
            if (instance) delete instance;
            instance = NULL;
            }
     
    protected :
            Singleton() {}
            ~Singleton() {}
     
    private :
            static T* instance;
            Singleton(Singleton&);
            void operator =(Singleton&);
    };
     
    template <class T> T* Singleton<T>::instance = 0;
    Et la classe qui l'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Montage_Gestion : public Singleton<Montage_Gestion>
    {
    private:
            friend class Singleton<Montage_Gestion>;
     
            Montage_Gestion();
            ~Montage_Gestion();
    public:
    };

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    Tu n'aurais pas oublié d'initialiser instance dans ton constructeur ?
    Neilos

  5. #5
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 886
    Points : 1 526
    Points
    1 526
    Par défaut
    Je n'ai pas la réponse, mais le problème est classique: Un singleton est une variable statique, et une variable statique déclarée dans un programme n'est pas accessible depuis une DLL, et réciproquement, puisque chacun a son propre segment de données. Comme les paquets borland ne sont que des DLL renommées en BPL, le problème est identique.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 311
    Points : 337
    Points
    337
    Par défaut
    Il me semble avoir déjà entendu parler de ça...

    Y a-t-il une solution à ce problème?

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    Un espace mémoire commun...je sais que ça existe mais je serais bien incapable de te dire comment faire :-(
    Neilos

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Le singleton template ça peut être bien pratique, mais dès qu'on fait ce genre de manip ça devient vite un problème.

    Essaye de remplacer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template <class T> T* Singleton<T>::instance = 0;
    Par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template <> XXX* Singleton<XXX>::instance = 0;
    Dans le fichier .cpp correspondant à chaque classe singleton XXX.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 311
    Points : 337
    Points
    337
    Par défaut
    Non, ça ne change rien...

  10. #10
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 136
    Points : 115
    Points
    115
    Par défaut Plusieurs instances d'un singleton pour plusieurs modules
    Bonjour tout le monde,

    je vais peut être dire une connerie, mais est ce qu'il ne serais pas possible de lier la variable global "instance =0" de chaque DLL avec un sémaphore ou un mutex?

    Grâce au sémaphore, on pourrait au moins savoir si une instance existe déjà.

    ensuite, le but du jeu consiste a recuperer la valeur s'il y en a une... on pourrait passer par la BDR ou un fichier ini.

    la solution la plus propre serait de partager une Zone mémoire via un "Pipe Line" ( si si, ca peut exister, mais je sais pas le mettre en oeuvre ).

    bon courage

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 311
    Points : 337
    Points
    337
    Par défaut
    Il a suffi de supprimer le template et de recréer de toutes pièces le code du singleton pour que tout fonctionne...

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

Discussions similaires

  1. [Hudson] SureFire XML des rapports de test pour plusieurs modules
    Par psgman113 dans le forum Intégration Continue
    Réponses: 1
    Dernier message: 11/06/2010, 22h45
  2. Réponses: 7
    Dernier message: 03/04/2007, 16h30
  3. [MySQL] UNE date pour plusieurs dates et UN évènement pour plusieurs évènements...
    Par Aliosha dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 19/03/2007, 21h58
  4. Manager unique pour plusieurs instances ?
    Par siddh dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 18/09/2006, 09h47
  5. [VBA-E] Conserver une variable pour plusieurs modules
    Par pilote301152 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 13/05/2006, 13h14

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