Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-02-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.195
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Memoria Compartida. Shared Memory

Voy a intentar ser breve.

He implementado una clase C++ para compartir memoria desde mas de una aplicación, según los consejos de Microsoft. La clase es muy simple, consta de un constructor que distingue entre servidor y cliente y una función que devuelve el Buffer de memoria compartida.

El uso que quería darle y para la que la diseñé era para pasar los parámetros de la linea de comandos de un programa, a otra instancia previa del mismo. De forma que el primero en crearse recibe un Mensaje de la segunda instancia para crear un objeto SaredMemory en modo cliente y leer lo que la primera instancia le coloca en el buffer, que también ha abierto como servidor. Después, el servidor se autodestruye y el cliente cierra su SharedMemory, pero antes copia el contenido en una memoria local.

Esto funciona. Se pasan los parámetros, se procesan y todo bien, salvo que al cerrar la aplicación (primera instancia, la otra ya no "vive") se produce un error de acceso a memoria.

No se si se debe a lo fugaz de la existencia de los objetos SharedMemory, o a la destrucción del servidor. El caso es que la memoria se pasa de una instancia a la otra, la copio y no se producen errores.

Se que existe un componente TSharedMemory que he descargado, aunque no lo he probado, quizás porque el mio no es realmente un componente sino una clase... Y porque debe existir desde la fase de diseño no siendo esta mi idea original.

¿Alguien tiene una explicación o tiene ideas que me puedan ayudar?.

Saludos.
Responder Con Cita
  #2  
Antiguo 24-02-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
¡Hola!

Conozco algo sobre el tema de memoria compartida, pero lo he manejado más que nada con Delphi.

Quizá se te facilite hacerlo mediante objetos superglobales. Es el mismo concepto pero llevado a su máxima expresión.
http://www.clubdelphi.com/foros/showthread.php?t=53146

De cualquier manera, creo que el código de mi clase podría servirte de orientación. Utilizo las mismas funciones de la API de Windows.

Saludos.

Al González.
Responder Con Cita
  #3  
Antiguo 24-02-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.195
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
[Al González] He mirado por encima tu código. Aunque lo mio es el C++, mas o menos lo entiendo.

Te basas en un Shared Memory tal y como propone Microsoft. Es posible que mi error esté en la brevedad de la existencia de esa memoria compartida. En tus objetos superglobales la existencia es la misma que la del propio objeto. Sin embargo Mi uso es simplemente durante el "traspaso" de información de un proceso al otro y luego lo destruyo. A esto se añade que la instancia servidora
se autodestruye. Como por medio existe un mensaje Windows... Puede que se produzca algún error de sincronismo. Pienso que la solución puede pasar por la no autodestrucción de la instancia servidor, sino una destrucción desencadenada por un mensaje respuesta del cliente...
Responder Con Cita
  #4  
Antiguo 26-02-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.195
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Pues he mirado un componente llamado TfisSharedMemory, lo he usado y obtengo el mismo problema que con mi clase: Al cerrar la aplicación obtengo una excepción de violación de memoria, pero sólo si lo ejecuto desde el debuger del Builder. Si la ejecución es directa desde S.O. no. Empiezo a dudar si realmente es un error o es una mala interpretación del mismo Builder.

El caso es que si es un verdadero error, el programa podría fallar en cualquier momento (corrupción de memoria) ¿que hago?.

Si tenéis ideas....
Responder Con Cita
  #5  
Antiguo 27-02-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

Hay que ubicar la línea de código que genera el error y a partir de ahí depurar tu aplicación para ver dónde está el problema.

¿Ya hiciste una prueba aislada? Es decir, una nueva aplicación en blanco con sólo lo indispensable para probar la memoria compartida. Quizá el problema esté en otra parte del código de tu aplicación.

Saludos.

Al.
Responder Con Cita
  #6  
Antiguo 27-02-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.195
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Gracias Al, estoy en ello. Pero es difícil porque el error no salta en ninguna línea de código, sino al cerrar el programa. Lo que se puede debugear es el depurador en ensamblador, pero no código en C. Esa idea que apuntas es la que estoy barajando. Probablemente un error en punteros, que son los más difíciles de detectar y depurar cuando no sabes la línea.
Responder Con Cita
  #7  
Antiguo 28-02-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.195
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Error depurado. Funciona OK.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
out of memory con tablas en memoria jrmanso Firebird e Interbase 8 20-06-2007 22:57:37
Sobre las perdidas de memoria (memory leak) sitrico OOP 2 05-04-2007 20:30:54
Memoria compartida y semáforos Duc API de Windows 2 03-02-2007 23:31:45
insuficiente memoria / insuficient memory mmateo25v Conexión con bases de datos 6 23-03-2005 17:46:27
CreateFileMapping (memoria compartida) Al González API de Windows 2 18-12-2003 16:04:44


La franja horaria es GMT +2. Ahora son las 16:12:00.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi