DOCUMENTATION EN LIGNE
DE WINDEVWEBDEV ET WINDEV MOBILE

Aide / WLangage / Fonctions WLangage / Fonctions standard / Fonctions de gestion des traitements / Fonctions de gestion des zones de mémoire partagées
  • Présentation
  • Comment le faire ?
  • Créer une zone de mémoire partagée
  • Savoir si une zone de mémoire partagée existe déjà
  • Manipuler le contenu d'une zone de mémoire partagée par programmation
  • Dialogue entre plusieurs applications
  • Notification automatique des modifications
  • Synchronisation manuelle
  • Nommage des zones de mémoire partagées
  • Gestion du mode de partage
  • Correspondance entre le nom fourni à fMemOuvre et l'ouverture en C
WINDEV
WindowsLinuxUniversal Windows 10 AppJavaEtats et RequêtesCode Utilisateur (MCU)
WEBDEV
WindowsLinuxPHPWEBDEV - Code Navigateur
WINDEV Mobile
AndroidWidget AndroidiPhone/iPadWidget IOSApple WatchMac CatalystUniversal Windows 10 App
Autres
Procédures stockées
Présentation
WINDEV, WEBDEV et WINDEV Mobile proposent de manipuler les zones de mémoires partagées.
Les zones de mémoires partagées sont un mécanisme de communication entre plusieurs applications sur un poste donné. Elles permettent par exemple d'échanger simplement des données entre un service et l'application de paramétrage.
Les fonctions de gestion des zones de mémoire partagées utilisent les API standard des différents systèmes d'exploitation (Windows ou Linux) et facilitent l'interopérabilité entre les applications WINDEV/WEBDEV/WINDEV Mobile et des applications développées dans d'autres langages.
Comment le faire ?

Créer une zone de mémoire partagée

Les zones de mémoire partagées sont créées et ouvertes par la fonction fMemOuvre.
La première application accédant à la zone provoquera sa création, les applications suivantes feront une simple ouverture.
L'application qui crée la zone détermine sa taille en fournissant une taille minimale. Le système d'exploitation créera une zone d'une taille multiple de la taille des pages mémoire (4 Ko sous Windows 32 bits par exemple). La taille réelle de la zone mémoire peut être connue grâce à la fonction fTaille.
// Ouverture de la zone de mémoire partagée
IDZone est un entier
IDZone = fMemOuvre("MaZonePartagée", 50, partageGlobal)
SI IDZone > 0 ALORS
TailleZone est un entier
TailleZone = fTaille(IDZone)
Info(ChaîneConstruit("La zone de mémoire %1 a été ouverte. Elle a une taille de %2 octets.", ...
IDZone, TailleZone))
FIN
...
// Fermeture de la zone de mémoire partagée
fFerme(IDZone)

Savoir si une zone de mémoire partagée existe déjà

Dans certains cas, il est nécessaire de savoir si une zone de mémoire partagée existe déjà.
Par exemple, une application permettant de paramétrer un service peut s'assurer que le service est bien lancé de la façon suivante : il suffit de vérifier que le service a créé une zone de mémoire partagée particulière. Si la zone n'existe pas, l'application peut afficher un message d'erreur.
La fonction fMemExiste permet de savoir si une zone de mémoire partagée a déjà été créée par une autre application.
// Vérification de l'existence de la zone de mémoire partagée
SI fMemExiste("MaZonePartagée", partageGlobal) = Faux ALORS
Erreur("Vérifiez que le service XXX a bien été démarré.")
RETOUR
FIN

Manipuler le contenu d'une zone de mémoire partagée par programmation

Pour manipuler le contenu d'une zone de mémoire partagée, il est possible :
  • soit d'utiliser directement les fonctions de lecture et d'écriture dans les fichiers externes. Cette solution est conseillée pour les cas simples (transmission d'une chaîne par exemple).
  • soit d'utiliser la sérialisation automatique du WLangage (fonctions Sérialise et Désérialise), puis d'utiliser les fonctions de lecture et d'écriture des fichiers externes pour transmettre les éléments. Cette solution est conseillée pour la transmission par exemple de classes dont les membres correspondent aux éléments à transmettre.
Les fonctions de gestion des fichiers externes utilisables avec les zones de mémoire partagées sont les suivantes :
fEcritÉcrit :
  • une chaîne de caractères dans un fichier externe.
  • une portion de mémoire.
fEcritLigneÉcrit une ligne dans un fichier texte (au format ANSI ou UNICODE).
fLitLit :
  • un bloc d'octets (bloc de caractères) dans un fichier externe (ANSI ou UNICODE),
  • le contenu d'un fichier externe (ANSI ou UNICODE) pour l'affecter dans une portion de mémoire.
fLitLigneLit une ligne dans un fichier externe (au format ANSI ou UNICODE).
fPositionneRenvoie et modifie la position en cours dans un fichier externe.
Dialogue entre plusieurs applications
Deux applications peuvent partager des données en utilisant une zone de mémoire partagée.
Deux mécanismes de synchronisation sont possibles :
  • la notification automatique (en utilisant les fonctions de callback)
  • la synchronisation manuelle au moyen de sémaphore.

Notification automatique des modifications

La notification automatique des modifications peut être mise en place dès l'ouverture d'une zone de mémoire partagée.
Il suffit à chaque application accédant à la zone de mémoire de donner le nom d'une procédure WLangage en dernier paramètre de la fonction fMemOuvre. Cette procédure sera appelée automatiquement à chaque modification du contenu de la zone de mémoire partagée.
Pour attendre que les autres applications aient fini de traiter la notification (avant d'effectuer une nouvelle modification de la zone mémoire par exemple), il faut utiliser la fonction fMemAttend.
// Ouverture de la zone mémoire dans l'application 1
IDZone est un entier
IDZone = fMemOuvre("ZonePartage", 200, partageGlobal, "ModifMemoire")
...
// -- Procédure utilisée pour callback (application 1)
PROCÉDURE ModifMemoire(NomZoneModif est une chaîne, IDZoneModif est un entier)
Info(ChaîneConstruit("La zone %1 a été modifiée.", NomZoneModif))
// Ouverture de la zone mémoire dans l'application 2
IDZone est un entier
IDZone = fMemOuvre("ZonePartage", 200, partageGlobal, "ModifMemoire")
// Ecriture dans la zone
fEcrit(IDZone, "Bonjour, je suis l'application 2.")
// Attente de la validation du "Info" de la procédure "ModifMemoire" dans l'application 1
fMemAttend(IDZone)
// Deuxième écriture dans la zone
fEcrit(IDZone, "Nouvelle information.")
...

Synchronisation manuelle

La synchronisation peut être réalisée de façon manuelle selon le principe suivant :
  • Les applications ouvrent la zone de mémoire partagée et le sémaphore de dialogue.
  • La première application "prend" le sémaphore (fonction SémaphoreDébut).
  • La première application écrit ses données dans la zone de mémoire.
  • La première application libère le sémaphore (fonction SémaphoreFin).
  • La seconde application "prend" à son tour le sémaphore.
  • La seconde application lit les données écrite par la première application.
  • La seconde application libère le sémaphore.
Remarque : Si les deux applications veulent s'échanger des données, il faut utiliser deux sémaphores pour assurer la régulation.
Conseil : La synchronisation manuelle sera utilisée de préférence lorsque :
  • l'une des deux applications n'est pas écrite en WLangage.
  • le mécanisme de notification des modifications n'est pas disponible.
Nommage des zones de mémoire partagées
Les zones de mémoires partagées sont identifiées par leur nom.
Remarque : Les noms des zones de mémoire partagées sont sensibles à la casse aussi bien sous Windows que sous Linux.

Gestion du mode de partage

Selon les versions des systèmes d'exploitation, le mode de partage diffère :
  • Linux, Windows 2000 et antérieur : il n'y a qu'un seul espace de création de zone mémoire. Le paramètre <Partage> de la fonction fMemOuvre est ignoré.
  • Windows XP : le paramètre <Partage> de la fonction fMemOuvre est effectif si le service de changement rapide d'utilisateur est actif, sinon il est ignoré.
  • Windows Vista et postérieur : le paramètre <Partage> de la fonction fMemOuvre est géré. Les services sont dans un espace différent des utilisateurs. Pour partager une zone mémoire entre un service et une application dans la session d'un utilisateur, il faut utiliser la constante partageGlobal.
  • En Terminal Serveur : le paramètre <Partage> de la fonction fMemOuvre est géré. Chaque session ouverte sur le Terminal Serveur a un espace de mémoire différent. Des applications lancées dans la même session TSE peuvent partager une zone de mémoire créée avec la constante partageUtilisateur. Des applications situées dans des sessions différentes peuvent partager une zone de mémoire partagée créée avec la constante partageGlobal.
Linux

Correspondance entre le nom fourni à fMemOuvre et l'ouverture en C

Les deux exemples de code suivant montrent l'ouverture de la même zone mémoire (nommée "mazone" en WLangage et en C).
// Code en WLangage
IDZone est un entier
IDZone = fMemOuvre("mazone", 1024, partageGlobal);
// Code C équivalent
char * szNomZone = "mazone";
int nTaille;
int nMem;
key_t nKey;
int nAccess = 0666; // Ouverture en lecture/écriture

nTaille = 1024;
nKey = ftok(szNomZone+sizeof(char),(int) szNomZone[0]);
nMem = shmget(nKey, nTaille , nAccess);
Liste des exemples associés :
WD PartageMemoire Exemples didactiques (WINDEV) : WD PartageMemoire
[ + ] Cet exemple montre comment utiliser les fonctions de partage de mémoire avec WINDEV.

Il arrive souvent que plusieurs applications partagent des données lorsqu'elles sont lancées simultanément. Il est alors parfois nécessaire de recourir à un partage d'une zone mémoire. Cette zone mémoire permettra à toutes les applications lancées de partager des informations.
Version minimum requise
  • Version 15
Documentation également disponible pour…
Commentaires
Cliquez sur [Ajouter] pour publier un commentaire

Dernière modification : 25/05/2022

Signaler une erreur ou faire une suggestion | Aide en ligne locale