Singleton dans une DLL et espace mémoire propre - C++ - Programmation
Marsh Posté le 17-11-2005 à 18:01:30
Je ne crois pas que tu puisses partager des donnees entre deux programmes via une DLL. Regarde plutot du cote de COM.
Marsh Posté le 17-11-2005 à 18:06:27
déclare le pointeur du singleton dans un segment de mémoire partagée en utilisant le pragma data_seg :
Code :
|
un peu de lecture :
http://msdn.microsoft.com/library/ [...] lls.3f.asp
Marsh Posté le 18-11-2005 à 01:45:13
Finalement plus simple, j'utilisais une version template du singleton.
Il a suffi que j'en fasse un singleton "normal" pour que tout fonctionne nickel.
Merci!
Marsh Posté le 18-11-2005 à 14:02:42
si je comprends bien, avec la solution d'Harko, si plusieurs exécutable utilisent le singleton, seul le pointeur sera en mémoire partagée. donc le pointeur pointera vers un espace mémoire accessible que pour un seul processus ?
Marsh Posté le 19-08-2006 à 23:31:13
Si j'ai bien compris (ce dont je ne suis pas sûr), Harkonnen ne résoud pas le bon problème : il résoud le problème d'une DLL partagée entre plusieurs processus, chaque processus ayant une copie des variables statiques, et donc un singleton chacun. Le problème d'haazheel serait plutot lié au fait que, j'ai cru comprendre, il a une classe singleton template, dont il fait hériter tous ses singletons. Il a donc son pointeur d'instance statique déclaré de façon template, et donc il n'est pas compilé à la création de la DLL qui contient cette classe template (ça n'a d'ailleurs pas de sens), mais dans chaque DLL (ou exe) qui inclue cet header. Donc quand une fonction compilée pour une DLL accède au pointeur, elle accède au pointeur de cette DLL, et il peut donc il y avoir plusieurs pointeurs (ce qui est embêtant dans le cas d'un singleton ^^).
La solution que je proposerais serait plutot de rajouter, dans chaque classe singleton qui hérite du template singleton, une fonction "getInstance" (ou un autre nom, mais le même que celui de la classe template en tout cas) qui surcharge la fonction de la classe template, et qui appelle la fonction de la dite classe template. Je suis conscient que ce que je dis n'est pas clair, donc un petit exemple (sans rentré dans les détails, ça ne compile probablement pas ^^) :
le fichier qui contient la classe singleton template :
Code :
|
un fichier qui définie une classe singleton héritant de notre template :
Code :
|
voilà, normalement en faisant comme ça, ça fonctionne, à condition de ne jamais utiliser directement Singleton<T>::getInstance puisque si l'on fais ça, on utilise la variable statique "instance" de la DLL dans laquelle on fais cet appel, et non pas celui de la DLL dans laquelle on a compilé la classe singleton T (la classe UnSingleton dans l'exemple).
Marsh Posté le 06-08-2008 à 15:05:31
Bonjour.
Désoler de déterrer un vieux topic, mais la situation présentée ici se rapproche beaucoup de mon problème.
Tout d'abord replaçons nous dans le cas de ce topic, car la réponse donné au dernier post ne semble pas résoudre le problème.
Je présente d'abord les codes sources :
Le template des singletons génériques :
Code :
|
le singleton qui en dérive et en instancie par la même occasion (si on peut parler d'instanciation de template) :
Code :
|
la classe principale de ma DLL exemple :
.h
Code :
|
.cpp
Code :
|
la classe principale de mon executable :
.h
Code :
|
.cpp
Code :
|
la sortie affichée :
Code :
|
Le probleme ne semble donc pas résolu.
haazheel, initiateur de ce topic disait :
haazheel a écrit : Finalement plus simple, j'utilisais une version template du singleton. |
Le problème c'est que dans ma véritable application (les sources précentes n'était que des exemple pour des tests), j'utilise des template même en temps que singleton (attention a ne pas confondre au singleton générique de base qui est lui aussi un template).
j'utilisa quelque chose du genre :
Code :
|
Marsh Posté le 06-08-2008 à 16:02:13
Finalement pour l'exemple de base de ce topic, en exportant l'instanciation du singleton ça marche effectivement :
Code :
|
Il n'y a pas besoin de redéfinir la fonction d'accès sur l'instance du singleton (
Code :
|
) d'ailleur pour que cela marche.
pour ce qui est du
Code :
|
je ne suis très au clair de ce que ça apporte de déclarer le template comme externe ... peut être justement dans mon cas :
el_trex a écrit :
|
cela me sera utile ...
Je poursuit mes test en dans ce cas de figure a présent que le problème de base est résolu.
Marsh Posté le 06-08-2008 à 18:20:12
Pour l'instant je suis arrivé a une solution "médiane"
Le problème que j'ai est que l'on ne peut pas vraiment exporter un template :
Code :
|
ça build bien la Dll, mais du point de vu de l'exe :
Code :
|
par contre le build ne finit pas, et débouche sur une erreur à l'étape de link :
Code :
|
bien sur si j'enlève les export/import :
Code :
|
ça compile bien mais je me retrouve au problème initiale : duplication des instances :
Code :
|
finallement je suis obliger de simuler l'exportation du template pour passer l'étape de link.
Cela se fait en declarant et en exportant les différentes instance de template que l'on va utiliser :
TheTemplatedSingleton.cpp:
Code :
|
et
TestSingletonDll.cpp
Code :
|
En ce cas je peut builder l'executable car celui-ci n'utilise que l'instance du singleton template :
Code :
|
que je viens d'exporter explicitement (cette instance de TheTemplatedSingleton pour les type <int,int> )
et on peut voir que cela fonctionne effectivement :
Code :
|
Donc content ?
en fait NON car comme on le vois si on veut exporter un template, qui est singleton afin de n'avoir qu'une seul instance (par instance de template!) partager entre la (les) Dll et l'exécutable, il faut exporter explicitement TOUTES les instances possible du template que l'on serai a même d'utiliser au niveau de l'exécutable ... bref plutôt contraignant ...
Existe t'il une solution/une parade a cela ? je suis preneur de toute information en ce sens
Marsh Posté le 17-11-2005 à 17:50:00
Bonjour à tous,
J'ai une classe singleton Montage_Gestion qui se trouve dans une DLL nommé Montage.
J'ai remarqué le problème suivant:
quand j'instancie Montage_Gestion à l'intérieur de la DLL, j'ai bien une seule et unique instance de ce singleton, pas de soucis.
Si par la suite je passe par l'application .EXE pour instancier ce singleton, il ne me retourne pas le pointeur de Montage_Gestion déjà existant, mais il
m'en crée une nouvelle instance.
J'ai cru comprendre que c'est parce que la DLL et l'application utilisent des segments de mémoire différents et que le singleton utilise une variable statique.
Seulement je ne sais pas comment y remédier.
Quelqu'un saurait comment faire?
Merci d'avance
Mike