AYUDA EN LÍNEA
 WINDEVWEBDEV Y WINDEV MOBILE

Este contenido se ha traducido automáticamente.  Haga clic aquí  para ver la versión en inglés.
Ayuda / WLanguage / Funciones WLanguage / Funciones estándar / Funciones de gestión de procesos / Funciones de área de memoria compartida
  • Presentación
  • ¿Cómo proceder?
  • Creación de una zona de memoria compartida
  • Averiguar si una zona de memoria compartida ya existe
  • Manejar el contenido de una zona de memoria compartida a través de la programación
  • Diálogo entre varias aplicaciones
  • Notification automática de modificaciones
  • Sincronización manual
  • Nombrar las áreas de memoria compartida
  • Gestión del modo compartido
  • Correspondencia entre el nombre proporcionado a fMemOpen y la apertura en C
WINDEV
WindowsLinuxUniversal Windows 10 AppJavaReportes y ConsultasCódigo de Usuario (UMC)
WEBDEV
WindowsLinuxPHPWEBDEV - Código Navegador
WINDEV Mobile
AndroidWidget Android iPhone/iPadIOS WidgetApple WatchMac CatalystUniversal Windows 10 App
Otros
Procedimientos almacenados
Presentación
WINDEV, WEBDEV y WINDEV Mobile le permiten manipular áreas de memoria compartida.
Las zonas de memoria compartida son un mecanismo de comunicación entre varias aplicaciones de un mismo ordenador. Se utilizan para intercambiar fácilmente datos entre un servicio y la aplicación de configuración, por ejemplo.
Las funciones de gestión de las áreas de memoria compartida utilizan las APIs estándar de los diferentes sistemas operativos (Windows o Linux) y permiten una mejor interoperabilidad no sólo entre las aplicaciones WINDEV, WEBDEV y WINDEV Mobile, sino también entre las aplicaciones externas.
¿Cómo proceder?

Creación de una zona de memoria compartida

Las zonas de memoria compartida son creadas y abiertas por fMemOpen.
La primera aplicación que acceda a la zona provocará su creación mientras que las demás aplicaciones realizarán una simple apertura..
La aplicación que crea la zona define su tamaño proporcionando un tamaño mínimo. El sistema operativo creará una zona cuyo tamaño es múltiplo del tamaño de las páginas de memoria (4 KB sous en Windows 32 bits por ejemplo).. El tamaño real de la zona de memoria es devuelto por fSize.
// Open the shared memory area
ZoneID is int
ZoneID = fMemOpen("MySharedZone", 50, shareGlobal)
IF ZoneID > 0 THEN
ZoneSize is int
ZoneSize = fSize(ZoneID)
Info(StringBuild("The memory area %1 was opened. Its size is equal to %2 bytes.", ...
ZoneID, ZoneSize))
END
...
// Close the shared memory area
fClose(ZoneID)

Averiguar si una zona de memoria compartida ya existe

En algunos casos, puede ser useful para averiguar si una zona de memoria compartida ya existe.
Por ejemplo, una aplicación utilizada para configurar un servicio puede comprobar si el servicio se ha iniciado correctamente.: todo lo que tiene que hacer es comprobar si una zona de memoria compartida específica fue creada por el servicio. Si la zona no existe, la aplicación puede mostrar un mensaje de error..
fMemExiste se utiliza para averiguar si una zona de memoria compartida ya fue creada por otra aplicación.
// Check the existence of the shared memory area
IF fMemExist("MySharedZone", shareGlobal) = False THEN
Error("Check whether the XXX server was started.")
RETURN
END

Manejar el contenido de una zona de memoria compartida a través de la programación

Para manipular el contenido de una zona de memoria compartida, puede:
  • utilizar las funciones de lectura y escritura de los archivos externos. Esta solución se recomienda para los casos simples (transmisión de una cadena por ejemplo).
  • utilizar la serialización automatic de WLanguage (Serialize y Deserialize), luego utilizar las funciones de lectura y escritura en los archivos externos para transmitir los elementos. Esta solución se recomienda cuando se transmiten clases cuyos miembros corresponden a los elementos a transmitir.
Las siguientes funciones de gestión de ficheros externos pueden utilizarse con las zonas de memoria compartida:
fReadLineLee una línea de un archivo externo (ANSI o UNICODE).
fSeekDevuelve y modifica la posición actual en un fichero externo.
fWriteEscribe:
  • una cadena de caracteres en un fichero externo.
  • una sección de memoria.
fWriteLineEscribe una línea en un archivo de texto (ANSI o UNICODE).
LecturaLee:
  • un bloque de bytes (caracteres) en un archivo externo (ANSI o Unicode),
  • el contenido de un archivo externo (ANSI o Unicode) y lo asigna a una zona de memoria.
Diálogo entre varias aplicaciones
Dos aplicaciones pueden compartir datos utilizando una zona de memoria compartida.
Se dispone de dos mecanismos de sincronización:
  • la Notification automática (usando las funciones de devolución de llamada)
  • la sincronización manual a través de un semáforo.

Notification automática de modificaciones

La Notification automática de las modificaciones puede implementarse en cuanto se abre una zona de memoria compartida.
Para ello, cada aplicación que acceda a la zona de memoria debe pasar el nombre de un lenguaje WLanguage Procedure como último parámetro a fMemOpen. Esta Procedure será llamada automáticamente cada vez que se modifique el contenido de la zona de memoria compartida.
Para esperar a que la Notification sea procesada por las demás aplicaciones (antes de realizar una nueva modificación de la zona de memoria, por ejemplo), debe utilizar fMemEspere.
// Open the memory area in the application 1
ZoneID is int
ZoneID = fMemOpen("SharedZone", 200, shareGlobal, "ModifMemory")
...
// -- Procedure used for callback (application 1)
PROCEDURE ModifMemory(ModifZoneName is string, ModifZoneID is int)
Info(StringBuild("The memory area %1 was modified.", ModifZoneName))
// Open the memory area in the application 2
ZoneID is int
ZoneID = fMemOpen("SharedZone", 200, shareGlobal, "ModifMemory")
// Write into the zone
fWrite(ZoneID, "Hello, I am the application 2.")
// Wait for the validation of "Info" of the "ModifMemory" procedure in the application 1
fMemWait(ZoneID)
// Second write operation into the zone
fWrite(ZoneID, "New information.")
...

Sincronización manual

La sincronización manual se puede realizar según el siguiente principio:
  • Las aplicaciones abren la zona de memoria compartida y el semáforo de diálogo.
  • La primera aplicación "toma" el semáforo (SemaphoreStart).
  • La primera aplicación escribe sus datos en la zona de memoria.
  • La primera aplicación libera el semáforo (SemaphoreEnd).
  • La segunda aplicación "toma" el semáforo.
  • La segunda aplicación lee los datos escritos por la primera aplicación.
  • La segunda aplicación libera el semáforo.
Observación: Si las dos aplicaciones quieren intercambiar datos, se deben utilizar dos semáforos para asegurar la regulación.
Consejo: La sincronización manual se utilizará preferentemente cuando:
  • una de las dos aplicaciones no está escrita en WLanguage.
  • el mecanismo de modificaciones de Notification no está disponible.
Nombrar las áreas de memoria compartida
Las zonas de memoria compartida se identifican por su nombre.
Observación: Los nombres de las zonas de memoria compartida distinguen entre mayúsculas y minúsculas en Windows y en Linux.

Gestión del modo compartido

El modo compartido difiere según las versiones de los sistemas operativos:
  • Linux, Windows 2000 y versiones anteriores: hay un único espacio para crear la zona de memoria compartida. El parámetro de fMemOpen se ignora.
  • Windows XP: la de fMemOpen tiene efecto si la función de cambio rápido de usuario está activada; en caso contrario, se ignora.
  • Windows Vista y posterior: se admite el parámetro de fMemOpen. Los servicios y los usuarios están ubicados en un espacio diferente. Para compartir un área de memoria entre un servicio y una aplicación en la sesión de un usuario, debe utilizarse la constante shareGlobal.
  • En Terminal Server: se admite el parámetro de fMemOpen. Cada sesión abierta en el Terminal Server tiene un espacio de memoria diferente. Las aplicaciones que se inician en la misma sesión TSE pueden compartir un área de memoria creada con la constante shareUser. Las aplicaciones ubicadas en diferentes sesiones pueden compartir un área de memoria creada con la constante shareGlobal.
Linux

Correspondencia entre el nombre proporcionado a fMemOpen y la apertura en C

Los dos ejemplos de código siguientes presentan la apertura de un área de memoria (denominada "myzone") en WLanguage y C).
// Code in WLanguage
ZoneID is int
ZoneID = fMemOpen("myzone", 1024, shareGlobal)
// Equivalent code in C
char * szZoneName = "myzone";
int nSize;
int nMem;
key_t nKey;
int nAccess = 0666; // Open in read/write

nSize = 1024;
nKey = ftok(szZoneName+sizeof(char),(int) szZoneName[0]);
nMem = shmget(nKey, nSize , nAccess);
Versión mínima requerida
  • Versión 15
Esta página también está disponible para…
Comentarios
Haga clic en [Agregar] para publicar un comentario

Última modificación: 23/06/2023

Señalar un error o enviar una sugerencia | Ayuda local