FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Objetos superglobales
¡Hola a todos!
En los últimos días dediqué algunos ratos libres a escribir esta unidad de código. Es algo que programé hace varios años como parte de una biblioteca que contiene muchas otras cosas, pero decidí aislar y afinar este material para compartirlo con todos los colegas Delphi de manera más directa. La idea básica es poder crearnos clases derivadas de una como TSuperGlobalObject en lugar de TObject, cuando queramos tener una instancia de objeto que pueda ser compartida entre procesos de manera natural y transparente. Con esto, un programa Delphi en ejecución puede instanciar un objeto de clase definida por el programador, de la manera usual:
Y luego otro programa Delphi en ejecución puede hacer lo mismo:
En ese momento los dos procesos estarán compartiendo el mismo objeto, y podrán acceder a sus campos y métodos como lo harían con cualquier objeto normal. Los cambios que un programa hace sobre el objeto son automáticamente visibles para el otro programa. Esto resulta en una manera muy práctica de compartir información entre dos aplicaciones que se ejecutan en la misma máquina. Pueden hacérsele muchas mejoras a esta unidad, como adaptarle semáforos de acceso para controlar escrituras simultáneas o modificar algunas secciones de su código para hacerla segura para hilos (thread safe), pero la base ya está. Al final de este mensaje aparece un enlace para descargarla. He aquí su código (se aceptan críticas constructivas ):
Espero que a alguien le sea de utilidad. Ojalá todo mi trabajo consistiese en hacer cosas como esta. Algún día no muy lejano... Un abrazo superglobal. Al González. Última edición por Al González fecha: 12-02-2008 a las 08:53:09. |
#2
|
||||
|
||||
Excelente
Excelente Al, pinta muy bueno . Cuando vuelva a casa del trabajo lo probare.
__________________
[Crandel] |
#3
|
||||
|
||||
Hola,
Tiene buena pinta, ¿no? No lo he probado (estoy perezoso) pero tiene buena pinta, me parece. Gracias Al. |
#4
|
||||
|
||||
Hola Al,
Cuanto vi el título sospeché un poco... me llamó la atención pues mi loco cerebro me decía, sin haber leído "¿Pero que no eso se consigue empleando un singleton?" Fue mi sorpresa que al leer el hilo no se trataba de eso. Te debo una disculpa por haber dudado. Mil disculpas. Algo de esa "teoria" me suena, desafortunadamente, a chino. Pues nunca he estado probando las API de mapeo (al menos que yo recuerde). Pero tu bien documentada unidad sirve de ejemplo para comprender mejor los conceptos. Tiene una muy buena pinta. Tengo que probarla. No me puedo quedar sin las ganas de probarla. Saludos, |
#5
|
||||
|
||||
Interesante idea Al... en mas de una ocasión se ha planteado la manera de compartir información entre dos procesos que se ejecutan en la misma máquina. Esta solución "nativa" de delphi me parece muy interesante. Ahora estoy lejos de mi máquina habitual de trabajo, pero haré algunas pruebas cuando esté de vuelta.
Creo que es básico el soporte multi-hilos. Se que ya lo has planteado, pero pido permiso para echar mano en esa línea, a ver si llego a algo bueno. Un saludo.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#6
|
||||
|
||||
Decirte que funciona de maravillas
Todavia la parte del mapeo no me queda muy claro, lo voy a tener que seguir analizando y buscando un poco mas de info, pero me gusto Gracias
__________________
[Crandel] |
#7
|
|||
|
|||
Cita:
No tendrías algun ejemplo hecho que te funcione de como utilizarla a ver si me consigo aclarar. Llevo unas cuantas horas con la Unit y me SUPERA. gracias. |
#8
|
||||
|
||||
Hola avmm2004, aca te paso el ejemplo que escribi en aquel momento que lo probe, es muuuuy sencillo, simplemente escribe una variable en la memoria y la lee.
El programa esta en turbo delphi, pero no debería haber problema de compilarlo en otra versión. Simplemente compila el programa y luego ejecuta varias instancias de mismo. Veras que puedes modificar el valor de la variable desde un programa y luego leerlo desde otro de forma transparente.
__________________
[Crandel] |
#9
|
||||
|
||||
Bueno ... me dio un poco de verguenza mandartelo asi no mas, todoqueteado como niño de primaria al código de nuestro amigo Al.
Asi que aca te dejo la versión limpia y prolija. Donde lo único que debes hacer es modificar la clase MySuperGlobalClass con lo que quieras y no tocar la clase de Al. .
__________________
[Crandel] |
#10
|
|||
|
|||
Buenas,
Para empezar perdón por el reflote... Me ha surgido la necesidad de compartir objetos entre dos aplicaciones distintas, y he encontrado este hilo. Mi duda: El objeto que quiero compartir es un TORASession de los componentes ODAC de DevArt. Mi idea seria hacer algo así:
Para después en cada aplicación hacer algo parecido a esto:
Creéis que seria viable??? Gracias y un saludo. |
#11
|
||||
|
||||
Hola elliotduvorov, bienvenido al club. Como a todos los novatos, te invitamos a que revises la Guía de Estilo si no lo has hecho ya.
Respecto a tu pregunta, no estoy seguro de que vaya a funcionar ya que no creas ningún objeto. Realmente no he usado nunca este código, pero viendo el código adjuntado por Crandel, creo que deberías hacer algo así:
De todas formas, ten en cuenta las limitaciones de las que habla Al en la cabecera de su código, ya que el objeto "MiSesion" podría darte problemas. El artículo de la bitácora del máster Al incluye más información acerca del mecanismo, y dará pistas de qué se puede y qué no y por qué. Última edición por Ñuño Martínez fecha: 20-11-2015 a las 18:55:34. |
#12
|
||||
|
||||
Cita:
Del curso Object Pascal 1.0, sabrás que las instancias de Objetos habitualmente viven en el Heap de tu aplicación, y que las variables de tipo objeto (TMyObject) son realmente un puntero a esta memoria. De tal cuenta, en la aplicación donde originalmente creas la sesión, tendrás un puntero a una dirección de memoria válida, pero en cualquier otra aplicación que tenga acceso a este objeto super-global (incluso otra instancia de la misma aplicación) esa dirección a) puede no ser válida b) si lo es, definitivamente no residirá allí la instancia del objeto que esperas (lo cual es mucho peor). Lo que se vislumbra es un Access Violation, o la corrupción de memoria de la segunda aplicación (la que no ha creado originalmente el sub-objeto MiSesion). Dicho esto, aunque encontraras la forma de compartir la información de la sesión, la verdad no estoy seguro que se pueda compartir una sesión de Oracle entre varias aplicaciones, en todo caso habrá que revisar la documentación y el por qué quieres compartir la sesión antes de continuar. Un saludo.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#13
|
||||
|
||||
Genial Al, muchas gracias por compartir. En la noche haré pruebas pero de entrada me ha llamado mucho la atención.
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!" http://www.purodelphi.com/ http://www.nosolodelphi.com/ |
#14
|
||||
|
||||
#15
|
||||
|
||||
Esta , pues es que sólo hasta hoy me enteré
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!" http://www.purodelphi.com/ http://www.nosolodelphi.com/ |
#16
|
|||||
|
|||||
Gracias, Jhonny. De hecho son casi ochos años y un poquitín de vergüenza por volver a leer a aquel Al González.
Aprovecho para saludar a jachguate, de quien guardo hondos y buenos recuerdos, esperanzado en que sólo han de ser los primeros de muchos más. Y claro, Antonio, el código es libre, puedes mirar lo de echar mano en la línea de multi-hilos (perdón por el pequeño retraso ). Por cierto, aquello sigue pendiente, ya merito. elliotduvorov: Toma muy en cuenta todo lo que te dice jachguate, comparto al 100% su opinión. Es más, debo decir que tiempo después surgió una importante pifia en esa clase. Me permito copiar aquí una breve correspondencia que tuve con colega Delphi en noviembre de 2011, en la cual de describe el problema y se ofrece una probable solución. NOTA: Consideren que es información técnica informal, sin pruebas rigurosas de por medio. Lo pongo porque puede ser útil para quienes se interesen en encontrar una solución definitiva y elegante. Cita:
Cita:
Cita:
Cita:
Cita:
Al González. |
#17
|
||||
|
||||
¡Jachquate ha vuelto! ¿O quizá es que nunca te fuiste?
Al: Gracias por esa correspondencia. |
#18
|
|||
|
|||
Como es un hilo que tiene bastante tiempo espero que se pueda reactivar.
Estoy utilizando la clase de AL AGSuperGlobals para compartir en memoria un objeto entre distintas aplicaciones que contiene algunos datos del perfil del usuario logueado, para mantener un login único de las aplicaciones. Lo comparte todo bien pero al intentar liberar el objeto me da un access violation pese a haber usado la forma que sugiere AL: Obj.FreeInstance; Alguna idea de como liberarlo? Gracias. |
#19
|
||||
|
||||
Cita:
Saludos. |
#20
|
|||
|
|||
Hola Al, no hay problema.
En este momento no la estoy usando porque use CreateFileMapping ya que tenía que resolverlo cuanto antes. De todos modos es una clase muy interesante que me gustaría utilizar. Desarrollo con Delphi 7 Un abrazo y gracias. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Objetos Perdidos. | marcoszorrilla | La Taberna | 8 | 04-05-2007 20:50:23 |
copia de objetos | emeceuy | OOP | 3 | 11-12-2006 04:59:55 |
Prioridades de Objetos | JerS | Varios | 2 | 10-11-2005 14:53:10 |
Una lista de Objetos en .NET | bustio | .NET | 1 | 11-10-2004 16:23:08 |
Objetos | jfontane | Varios | 1 | 04-07-2003 16:39:04 |
|