Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
Memoria Compartida
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Memoria Compartida 
 
Hola a todos..... hace un par de años hice un programa en gambas 2 que entre otras cosas comparte memoria con otra aplicación por intermedio de una librería externa que tambien programe en c++....... el programa anduvo siempre bien sin presentar problemas pero hace poco tuve que hacer algunos agregados y al migrar a gambas 3 se me presento un problema con el uso de la memoria compartida......

en la version original programada en gambas 2 obtenía los datos de la siguiente manera:

index = 0

Do
     Read #Puntero_Lectura + index * 4, datos_in[index]
     index = index + 1
Loop Until index = 1000

donde:
Puntero_Lectura = posición de memoria de mi 1er dato (me lo da la librería externa)
datos_in = array de datos donde guardo los valores leídos

El tema es que según lo que he leído, en gambas 3 no se puede hacer la lectura de memoria indexada de esta forma y tendría que usar la instrucción "Memory" y "Read"

He intentado hacerlo pero no encuentro la forma....... la verdad es que no me queda claro como hacerlo usando esas instrucciones; si algún miembro del foro me puede dar una mano con esto se los agradeceré enormemente.
 



 
Sebito - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Memoria Compartida 
 
Sebito escribió: [Ver mensaje]
tendría que usar la instrucción "Memory" y "Read"


Los recursos de "Memory Stream" permiten escribir y leer en areas de memoria apuntadas por variables de tipo "Puntero", en manera parecida a uno stream o file.

En partiicular nosotros podemos decir que este recurso sirve "más" para escribir dentro un area apuntada por un Puntero, porqué para leer (y SOLO para LEER) se puedon "tambien" utilizar las funciones especiales (ad hoc) de Gambas: Byte@( ), Short@(), Int@(), et cetera.

MEMORANDUM:
[1] los recursos de "Memory Stream" se puedon utilizar para "ESCRIBIR" y para "LEER" en areas de memoria reservadas y apuntadas por un Puntero;
[2] las funciones especiales: Byte@( ), Short@(), Int@(), et cetera, se utilizan solo para "LEER" en areas de memoria reservadas y apuntadas por un Puntero.
[3] si usamos "Memory Stream" tenemos que leer y escribir de la variable de tipo Stream.
[4] si usamos las especificas funciones de gambas, tenemos que leer de la variable de tipo Puntero.


Vamos a hacer un ejemplo, donde antes escribimos datos en el area de memoria reservada y apuntada por un Puntero, y luego vamos a leer los datos de aquel area de memoria.
Public Sub Main()

  Dim p As Pointer
  Dim st As Stream
  Dim scribo, lego As Byte
  Dim i As Integer
  
' Reservamos una cantidad de memoria de 8 byte:
  p = Alloc(SizeOf(gb.Byte), 8)
  
' Creo una variable de tipo "Stream" para poder escribir y leer en el area apuntada por el Puntero "p":
  st = Memory p For Read Write
  
'' ESCRIBIENDO
  
  For scribo = 1 To 8
' Escribimos usando "Write"... como si fuera un File. Escribimos en este ejemplo valores de tipo "Byte".
    Write #st, scribo As Byte
  Next

'''''''''''''''''''''''''''''''''''''''''''''''''''''''

' Está claro que tenemos que volver al índice 0 del "stream", para leerlo desde el principio:
  Seek #st, 0


'' LEYENDO
  
  For lego = 1 To 8
' Leemos de el area de memoria reservada usando "Read"... como si fuera un File:
     Read #st, lego
     Print lego
  Next

' Ahora podemos cerrar el flujo:
  st.Close


  Print

' Por supuesto, para LEER, podemos utilizar tambien  la especifica funcion "Byte@()":

 For i = 0 To 7   ' <---- Prestemos atención a el índice !!!

' Leemos de el area de memoria reservada usando "Byte@( )".
' Para avanzar en el índice interno del Puntero, tenemos que usar un valor de tipo " Integer " !
     Print Byte@(p + i)
  Next
  

' Terminando siempre tenemos que liberar el area de memoria ocupada:
  Free(p)

End

 



 
última edición por vuott el Jueves, 09 Agosto 2018, 00:12; editado 16 veces 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Memoria Compartida 
 
..un simpatico ejemplo siempre es modificar uno o más pixel de una imagen.  

(Hace falta activar tambien los Componentes gb.image y gb.image.io)
Public Sub Main()
  
  Dim im As Image
  Dim st As Stream
  
  im = Image.Load("/ruta/del/archivo/imagen")
  
' Crea una variable de tipo "Stream" desde la dirección de memoria del miembro
' de la Estructura del Objeto "Image", donde están almacenados los datos de la imagen:
   st = Memory im.data For Write
  
' ...modificará el 9° (index 8) pixel de la imagen cargada, teniendo en cuenta de su formato:
   Seek #st, 8 * Len(im.Format)
  
' Escribe el nuevo valor para el 9° pixel (Alfa, Red, Green, Blue) de la imagen:
   Write #st, &FFFFFF00 As Integer
  
' Cerra el flujo de datos:
   st.Close
  
' Guarda el nuevo archivo imagen .PNG:
   im.Save("/tmp/immago.png", 100)
 
End


Ahora, al abrir este nuevo archivo .png y agrandándolo al máximo, es posible ver el único píxel amarillo en la parte superior a la izquierda.
 



 
última edición por vuott el Jueves, 09 Agosto 2018, 00:19; editado 2 veces 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Memoria Compartida 
 
vuott, excelentes ejemplos, las variables stream y pointer son inexploradas por mi, tengo que hacer un tiempito y jugar con esos ejemplo para aprender algo nuevo.

saludos y gracias.
 




===================
Software libre, programación libre, vida libre es la Public function Libertad()as Invendible
Proyectos: VisorRV1960,Taller2015,Tanteador
https://sourceforge.net/u/v3ctor-full/profile/
Blog: http://novatocodegambas.blogspot.com.uy/
 
v3ctor - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Juego De Memoria chen_08 General 3 Viernes, 26 Febrero 2010, 14:36 Ver último mensaje
chen_08
No hay nuevos mensajes Juego De Memoria chen_08 Aplicaciones/Fragmentos de Código 7 Lunes, 02 Abril 2012, 13:55 Ver último mensaje
Shell
No hay nuevos mensajes Variables Y Direcciones De Memoria Shell General 7 Lunes, 21 Octobre 2013, 18:00 Ver último mensaje
Shell
No hay nuevos mensajes ¿ Qué Ocupa Más Memoria ?. Shell General 14 Viernes, 25 Enero 2019, 12:04 Ver último mensaje
Shell
 

Publicar nuevo tema  Responder al tema  Página 1 de 1
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario



  

 

cron