Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: O2 en 23 de Julio de 2003, 01:19:59 PM

Título: Singletones Y Dll's
Publicado por: O2 en 23 de Julio de 2003, 01:19:59 PM
 Buenas:

Basandome en los COTW de CordayUK y ethernet, decidi cambiar mi implementación de singleton.

Uso un template singleton igual que el de ethernet, con la salvedad de que si que tengo la instancia de la clase a "singletonizar" como miembro static del singleton, el lugar de crearlo en la función GetInstance() o similar.

Tanto el template como las clases "singletonizadas" estan en una DLL que uso desde otro programa, pues bien, lo curioso de todo el asunto es que cada vez que hago por ejemplo un CWindow::GetInstance() me pasa una instancia nueva (haciendo el consiguiente new nuevo)

inline Type &GetInstance() {
   if(!m_Instance)
       m_Instance=new Type;

   return *m_Instance;
}


¿Como es esto posible?

¿Tendra algo que ver la DLL?

Los Singletones los creo heredando del template

class CWindow : public CSingleton {...

A ver si a alguien le ha pasado algo similar...

Muchas gracias!

P.D: Que es lo que cambia exactamente si creo la instancia static en la función GetInstance() a si ya la tengo como miembro? (A parte de tener que inicializarla fuera)
Título: Singletones Y Dll's
Publicado por: ethernet en 23 de Julio de 2003, 01:42:14 PM
 DLL + templates + new + inline = infierno

He leido acerca de problemas con los inline en vc++ 6.0
Tb he tenido muchos problemas con DLL's y templates (trabajando con STL)

No te da ningun warning al compilar la aplicacion que enlaza con la dll?

saludos y suerte xDD

PD: la implementacion no era mia, lo deje bien claro, es de Antonio Tejada  
Título: Singletones Y Dll's
Publicado por: ethernet en 23 de Julio de 2003, 01:44:19 PM
 
Citar

P.D: Que es lo que cambia exactamente si creo la instancia static en la función GetInstance() a si ya la tengo como miembro? (A parte de tener que inicializarla fuera)


Pues ganas el tener una variable static en una clase templatizada q como sabes hay q defiirlas en el .h y puede dar problemas de link con la variable static (de la clase). Mucho mejor tenerla static en la funcion.

saludos
Título: Singletones Y Dll's
Publicado por: tamat en 23 de Julio de 2003, 01:55:15 PM
 como no lo veo en tu codigo me veo en la obligación de asegurarme, inicializas la variable estatica a NULL, verdad?
Título: Singletones Y Dll's
Publicado por: O2 en 23 de Julio de 2003, 02:09:07 PM
 ethernet: Uso .NET, supongo que habra corregido los bugs con los inlines que mencionas (si es que te refieres a bugs). No me da ningu error de compilación ni warning. Simplemente depurando la aplicación me encuentro con que cuando hago en segundo GetInstance() al singleton, resulta que if(!m_Instance) es verdadero, osea que la instancia previamente creada ahora es nula, y por ende me crea y devuelve una nueva cada vez :(

Voy a probar a pasar la instancia estatica a la función en vez de declararla como miembro.

tamat: Si, esta inicializada a NULL fuera de la clase :)

Gracias a ambos. Os mantendre informados.
Título: Singletones Y Dll's
Publicado por: MChiz en 27 de Julio de 2003, 01:30:22 AM
 Hola a todos:

O2, me he encontrado con tu mismo problema, y no se me ocurre la forma elegante de solucionarlo.

Estoy casi seguro al 100% de saber lo que pasa. Para resumirlo, cada DLL que cargas tiene sus variables static. Es decir, si tu juego tiene una clase que es, por ejemplo, la clase de la aplicacion, y ahi tienes una variable estatica. Bien, tu desde una DLL puedes hacer el include de esta clase y acceder a este miembro. Imaginemos tambien que este miembro lo inicializas desde tu juego, fuera de la DLL. Cuando accedas desde la DLL, en realidad no estas utilizando la misma direccion de memoria.

No creo que me haya explicado bien, pero alguien que sepa de que va el tema quizas nos pueda ayudar. Yo ya estoy un poco desesperadillo :b

Gracias de antemano!
Título: Singletones Y Dll's
Publicado por: tamat en 28 de Julio de 2003, 01:13:00 PM
 Sips, es lo que dice MChiz, segun tengo entendido las variables estaticas (y las globales) se generan por cada compilado por lo tanto si tienes una app y una DLL aparte que tienen ambas la misma variable global o atributo estatico de una clase en realidad son dos variables distintas, una dentro de la DLL y otra en la app de modo que si referencias desde tu app a la variable estas llamando a una direccion de memoria diferente que si lo haces desde la DLL.

Yo me encontré con ese problema porque tenia un vector global de errores donde cada funcion podia volcar los que considerara oportuno, sin embargo si lo hacia desde la DLL mi APP no se enteraba ya qie los metia donde no tocaba así que solo tenia dos opciones, o exportaba tambien el vector y lo captaba desde mi app o me encargaba de suministrar dicho vector a cada DLL al cargarla para que compartieran la misma direccion de memoria y al final he optado por esto segundo y funciona. Pero sigue siendo una chapucilla a falta de nada mejor, si alguien conoce alguna solución más elavorada...
Título: Singletones Y Dll's
Publicado por: MChiz en 28 de Julio de 2003, 03:49:03 PM
 Al final he hecho lo que dices, tamat. Le he dado el puntero a la DLL, pero es una guarrada...
Título: Singletones Y Dll's
Publicado por: tamat en 28 de Julio de 2003, 06:49:08 PM
 Weno, supongo que si le pones unos adornitos no parece tan warro, es decir, creas una estructura para almacenar los datos que deban compartir los diferentes bloques de codigo y lo suministras al cargar las DLLs, és lo mismo pero más pr0 :)
Título: Singletones Y Dll's
Publicado por: MChiz en 28 de Julio de 2003, 08:14:15 PM
 Bueno, en mi caso se trataba de un Singleton, asi que no me ha hecho falta crear nada, pero es buena idea lo que propones. Pero sigue sin gustarme el tema : (
Título: Singletones Y Dll's
Publicado por: MA]Mestre en 28 de Julio de 2003, 09:49:22 PM
 Si lo que necesitais es compartir una variable sobre múltiples proyecciones de una Dll, debeis crearos una nueva sección de código con los siguientes con atributos de compartición/lectura/escritura. A saber :

#pragma data_seg ("mi_section")

Variable=Valor ;

#pragma data_seg ( )

#pragma comment (linker, "/section:mi_section,rws")


Ufff , os es puesto el codigo de memoria, así que queda sujeto a errores. Sobretodo hay que inicializar la Variable puesto que si no se ira al .bbs y no servira de nada la seccion creada.

Un saludo.  
Título: Singletones Y Dll's
Publicado por: MChiz en 28 de Julio de 2003, 10:41:40 PM
 ue!! Muchisimas gracias MA]Mestre!! Es una herramienta interesantisima!! Cuando acabe de pelearme con el MaxScript intentare hacer eso. Muchas gracias, en serio!!

Un saludote!!
Título: Singletones Y Dll's
Publicado por: MA]Mestre en 30 de Julio de 2003, 03:18:45 PM
 dnd hombre, hoy por ti mañana por mi xD

No se si alguien probo el codigo, como dije antes el codigo lo puese de la poca cache que tengo en el cebro, y puede ser que no fuera lo exacto que se necesita. Si algun problema, post !!!

Un saludo!!!
Título: Singletones Y Dll's
Publicado por: Mars Attacks en 30 de Julio de 2003, 03:38:48 PM
 Lo siento, no me he podido reprimir ^_^
El estilo de 3DPoder me ha dominado...

Fdo: el de la caché a rayas.
Título: Singletones Y Dll's
Publicado por: MA]Mestre en 30 de Julio de 2003, 04:11:28 PM
 ¿ pq no cambias el mensaje y lo adjudicas a tu nombre ? ¿ pq total ya no es mio ?


P.D: Yo tampoco me he podido resistir.
Título: Singletones Y Dll's
Publicado por: MChiz en 30 de Julio de 2003, 06:14:27 PM
 Hola MA]Mestre!!

He probado el codigo y no da resultado : ( Quizas es que hago algo mal.

Lo que yo hago es poner la variable entre los pragma data_seg( ) y luego el pragma del comment linker en el CPP de la DLL. Es asi? Tienes algun ejemplo o articulo donde lo pueda ver?

Muchas graciaaaaaas : )
Título: Singletones Y Dll's
Publicado por: MA]Mestre en 30 de Julio de 2003, 08:05:51 PM
 puedes postear el codigo del "pragma data_seg", y donde haces el if para mirar si existe el objeto. ?

Un saludo.

P.D: No hay URL ni nada, lo lei hace algunos años de no se que libro. Pero funciona seguro, pq lo probe por entonces y funciono.
Título: Singletones Y Dll's
Publicado por: MChiz en 30 de Julio de 2003, 10:42:35 PM
 A que te refieres con 'el if para mirar si existe el objeto'? Te refieres al Singleton?
Título: Singletones Y Dll's
Publicado por: MA]Mestre en 30 de Julio de 2003, 11:30:42 PM
 Si xD

P.D: Si te conectas esta noche a irc lo miramos de resolver, llamame aunque este mestrOFF.
Título: Singletones Y Dll's
Publicado por: ethernet en 31 de Julio de 2003, 07:18:37 AM
 Aunque este MestreOFF y este continuamente poniendo mensajitos de away indicando que no esta XDD ;@
Título: Singletones Y Dll's
Publicado por: O2 en 14 de Agosto de 2003, 12:39:43 PM
 Buenas de nuevo:

Bueno, con esto del veranito, irse a bañar y demas, ultimamente no programo nada...

En fin, si recordais tenia un problema con un singleton usandolo desde una DLL.

Es más o menos lo que deciais, pero en mi caso si que se exactamente donde esta el problema:

Tengo un proyecto de DLL, donde esta tanto el singleton, como las clases "singletonizadas", que genera el .dll y .lib correspondiente. Hasta aqui bien.

Luego tengo otro proyecto que uso de test de la DLL.

No se como usais vosotros la DLL desde otro proyecto, pero yo lo hago de la forma más cutre posible: cargo la .lib en tiempo de compilación con un #pragma comment(lib,"Libreria.lib") y el ejecutable resultante ya se encarga de usar la dll correspondiente.

En el test que uso para probar la DLL, a parte de la lib, necesito el "Libreria.h" que contenga las declaraciones de todo lo que la DLL exporta, y aqui esta el problema. Al ser el Singleton un template, tengo que incluir la implementación entera en el "Libreria.h"

De esta forma, si desde "Test.cpp" hago un CWindow::GetInstance() obtendre la instancia del singleton de "Libreria.h", mientras que si desde dentro de la DLL se hace un CWindow::GetInstance() se obtendra una nueva instancia del singleton que reside en la DLL.

¿Como puedo solucionar esto?

Hay alguna manera de no tener que incluir la implementación entera del template singleton en el Libreria.h?

Probe a dejarlo asi:

template<class Type> class CSingleton;

class CWindow : public CSingleton<CWindow> { ... };


Pero obviamente me dice que no puedo usar una clase indefinida como base de CWindow.

Hay alguna forma de no tener que usar un Libreria.h con todas las declaraciones de lo que contiene la DLL? Supongo que no...

Por otro lado mi DLL no tiene DllMain() ni nada de eso, simplemente contiene todas las clases y funciones "a pelo" ¿Que diferencia hay?

Muchas gracias.

Un saludo!
Título: Singletones Y Dll's
Publicado por: Mars Attacks en 15 de Agosto de 2003, 11:43:41 PM
Cita de: "MAMestre"] ¿ pq no cambias el mensaje y lo adjudicas a tu nombre ? ¿ pq total ya no es mio ?


P.D: Yo tampoco me he podido resistir.
O.T.: No puedo adjudicarlo a mi nombre. De todas formas no he cambiado su contenido, sólo su "presentación".
Mil perdones si te he causado alguna molestia, no es mi intención  :ph34r:

Título: Singletones Y Dll's
Publicado por: MA]Mestre en 18 de Agosto de 2003, 06:49:58 PM
 O2, no entiendo muy bien cual es tu problema, pero creo intuir que GetProcAddress te puede ayudar. Echale un vistazo.

offtopic:
Mars Attacks De todas formas no he cambiado su contenido, sólo su "presentación"
claro claro... y era necesario un offtopic, claro claro... ...escribire mal, sere coder, pero se soluciono el problema.

P.D: El del caché rayado.