FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Compartir datos en DLL llamada desde tres instancias
Hola buenas,
Se ha realizado una DLL que accede a un dispositivo físico. A esta DLL le pueden llamar varios programas, desde uno a cuatro. Con cada uno de los programas funciona correctamente por separado, pero cuando se han de compartir datos, no funciona debido al heap de cada instancia. Hemos emplado el ShareMem, y el FastShareMem, pero no parece funcionar puesto que NO tenemos acceso al código fuente de las aplicaciones y no es posible trabajar con 3 dll sino todas las aplicaciones comparten dicha librería. El problema es gestionar que los datos que abre o modifica una aplicación sean las mismas para la segunda, tercera etc. La forma de realizarlo, con los condicionantes que tenemos, estiamos que sería con Archivos proyectados en memoria. ¿sería esta la forma correcta? ¿existen otras alternativas? ¿alguna indicación previa o ejemplo? Hemos visto cosas, pero casi todas son referidas a aplicaciones y no a librerías. Gracias por anticipado y un saludo. |
#2
|
||||
|
||||
¿El DLL lo has hecho tú? Si es así, creo que es un mal enfoque. No puedes "compartir" la misma instancia DLL, de ahí que no te funcione. Quizá realizando un segundo programa "servidor" al que conecten los cuatro programas "cliente" y gestione las peticiones funcionaría mejor.
O eso, o un controlador de dispositivo (ya que dices que es para acceder a un dispositivo físico). |
#3
|
|||
|
|||
En primer lugar, gracias por respondernos tan rápido. Procedemos a contestar:
Sí, la DLL la hemos realizado nosotros. Esa es la principal duda que teníamos: los ejemplos que hemos visto son referentes a aplicaciones. Igual si hubiera varias DLL también funcionaría, pero no tenemos esa opción: todos los programas funcionan "contra" la misma DLL. Aunque nos queda la duda viendo el libro de M. Cantú: "la biblia de delphi". En su edición 7, viene lo siguiente en la pág. 547: "Si se carga el codigo de la DLL solo una vez, podríamos preguntarnos que ocurre con los datos globales. Básicamente, cada copia de la DLL tiene su propia copia de los datos, en el espacio de direcciones de la aplicación que llama. Sin embargo, posiblemente será necesario compartir datos globales entre las aplicaciones que usen una DLL. La técnica más común para compartir datos consiste en usar archivos proyectados en memoria. Usaremos esa técnica en el caso de una DLL, pero podemos también utilizarla para compartir directamente los datos entre las aplicaciones. Este ejemplo se llama DllMem e incluye el proyecto DllMem (la propia DLL) y el proyecto UseMem (la aplicación demo)." Desgraciadamente la persona que nos ha dejado el libro no dispone del CD y no es posible verificar sí es posible realizar lo que pretendemos. Estamos en trámites para adquirir el CD, pero suponemos que tardará aún. En cuanto a la alternativa, habíamos pensado realizar algo así, pero no somos expertos en delphi y nos llevaría a más cuestiones. La primera sería: ¿Cómo una aplicación puede "escuchar" peticiones desde una DLL? El mayor problema es la rapidez, por lo que el acceso a un fichero en el disco duro queda restringido. Y peticiones TCP/IP también. ¿Hay algún mecanismo de colas que pueda quedar abierto en un aplicación? |
#4
|
||||
|
||||
El uso de la red es el más apropiado. Si no recuerdo mal (hace mucho que no uso Delphi y me pasé a Lazarus) Delphi incluye todo lo necesario para hacerlo, incluso con ejemplos de sistemas cliente-servidor. En local (y me refiero a "localhost") es bastante rápido.
Aun así, sigo pensando que la mejor opción es crear un controlador de dispositivo, pero si no recuerdo mal, con Delphi es muy difícil (por temas de Windows, no del propio Delphi) y habría que hacerlo en C, y luego llamar a ese controlador (una vez instalado) desde los programas con llamadas al sistema. |
#5
|
||||
|
||||
JavB,
Cita:
Revisa esta información: Cita:
El código anterior en Delphi 7 sobre Windows 7 Professional x32, implementa una DLL que comparte data entre diferentes procesos por medio de Memory-Mapped Files y un programa que usa la DLL para monitorear y cambiar aleatoriamente la data compartida, como se puede ver en la siguiente imagen: En la imagen se puede ver cuatro programas que usan la DLL GlobalDataLib y comparten la data mapeada en memoria, cualquiera de ellos puede actualizar la data y esta sera vista inmediatamente por los otros programas. El código del ejemplo esta disponible en : GlobalDataLib.rar Nota: Con esta técnica se evita el uso de programas Cliente-Servidor, solo en los casos específicos donde pueda aplicarse, pero debe usarse con cuidado dado que todos los programas comparten la misma data que es mapeada en memoria, la clave para los Memory-Mapped Files son las funciones : CreateFileMapping y MapViewOfFile. Revisa esta información: Espero sea útil Nelson. Última edición por nlsgarcia fecha: 14-12-2014 a las 02:29:22. |
#6
|
||||
|
||||
Realmente impresionante, Nelson.
Y como bien dices, cuidado porque se comparte memoria. Me pregunto si podría implementarse algún sistema de semáforos, al estilo de los programas multi-hilo, para evitar colisiones y conflictos. |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Llamada desde PC | carmelina | Varios | 0 | 29-03-2010 14:46:56 |
Compartir "objetos" entre varias instancias | mafebresv | Varios | 4 | 17-01-2006 00:38:23 |
LLamada a un cgi desde php | apicito | PHP | 5 | 26-10-2005 15:15:31 |
registros correlativos desde tres pc | fixarg | Conexión con bases de datos | 3 | 17-10-2004 17:45:56 |
DataModule llamado desde varias instancias | floren | OOP | 4 | 06-04-2004 20:27:50 |
|