Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Singletones Y Dll's

Iniciado por O2, 23 de Julio de 2003, 01:19:59 PM

« anterior - próximo »

O2

 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)

ethernet

 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  

ethernet

 
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

tamat

 como no lo veo en tu codigo me veo en la obligación de asegurarme, inicializas la variable estatica a NULL, verdad?
Por un stratos menos tenso

O2

 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.

MChiz

 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!

tamat

 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...
Por un stratos menos tenso

MChiz

 Al final he hecho lo que dices, tamat. Le he dado el puntero a la DLL, pero es una guarrada...

tamat

 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 :)
Por un stratos menos tenso

MChiz

 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 : (

MA]Mestre

 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.  

MChiz

 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!!

MA]Mestre

 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!!!

Mars Attacks

 Lo siento, no me he podido reprimir ^_^
El estilo de 3DPoder me ha dominado...

Fdo: el de la caché a rayas.

MA]Mestre

 ¿ 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.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.