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
  • Gestion du mode de partage
  • Correspondance entre le nom fourni à fMemOuvre et l'ouverture en C
  • Gestion des zones mémoires au format UNICODE
  • Positionnement dans la zone de mémoire partagée
  • Fermeture de la zone de mémoire partagée
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
Ouvre une zone de mémoire partagée entre plusieurs applications.
Le contenu de la zone mémoire peut ensuite être manipulé par les fonctions fPositionne, fLit et fEcrit.
Exemple
// Création/Ouverture d'une zone mémoire partagée entre applications (1ère application)
tabIDZone est un tableau associatif d'entiers
IDZone1 est un entier
IDZone1 = fMemOuvre("MaZonePartagée", 1024, partageGlobal, ...
foLectureEcriture, ProcédureModification)
tabIDZone["MaZonePartagée"] = IDZone1
...
// Création/Ouverture d'une zone mémoire partagée
// entre applications (2ème application) -
// pas de callback
IDZone2 est un entier
IDZone2 = fMemOuvre("MaZonePartagée", 1024, partageGlobal)
// Ecriture dans la zone mémoire partagée
fEcrit(IDZone2, "Bonjour, je suis une application WINDEV !")
...
// L'écriture par la 2ème application déclenche
// l'appel de la procédure dans la 1ère application
// -------------------------
// Procédure appelée à chaque modification de la zone mémoire partagée
PROCÉDURE ProcédureModification(NomZoneNotif est une chaîne)
ChaîneModifiée est une chaîne
ChaîneModifiée = fLit(tabIDZone[NomZoneNotif], 1024)
Trace(ChaîneConstruit("La chaîne %1 a été écrite dans la zone %2", ChaîneModifiée, NomZoneNotif))
WINDEVWEBDEV - Code ServeurLinux
llMemHdl est un entier
sNomFic est une chaîne = fRépertoireTemp() + ["/"] + "ipc0"
fSauveTexte(sNomFic, "")
sNomZoneMem est une chaîne = Caract(3) + sNomFic
llMemHdl = fMemOuvre(sNomZoneMem, 1024, partageGlobal)
 
// Code C équivalent
// char * szNomZone = "/tmp/ipc0";
// int nTaille;
// int nMem;
// key_t nKey;
// int nAccess = 0666;
// Ouverture en lecture/écriture
 
// nTaille = 1024;
// nKey = ftok(szNomZone, 3);
// nMem = shmget(nKey, nTaille, nAccess);
Syntaxe
<Résultat> = fMemOuvre(<Zone mémoire> , <Taille> [, <Partage> [, <Mode d'ouverture> [, <Procédure WLangage>]]])
<Résultat> : Entier
  • Identifiant de la zone mémoire.
    Cet identifiant peut être manipulé par les fonctions fxxx de la même façon qu'un identifiant de fichier externe renvoyé par fOuvre.
  • -1 en cas d'erreur.
<Zone mémoire> : Chaîne de caractères
Nom de la zone de mémoire partagée à créer ou à ouvrir. Ce nom doit être le même dans les différentes applications accédant à la zone.
Si la zone n'existe pas, elle est automatiquement créée.
Linux Le nom de la zone mémoire doit être de la forme :
Caract(<Val>) + <Nom fichier unix existant>

où <Val> est un entier de 1 à 127 qui correspond au second paramètre de l'API "C" ftok() (pour le cas où l'échange doit être réalisé avec un processus écrit en C).
<Taille> : Entier
Taille minimale de la zone de mémoire partagée en octets.
  • Si la zone existe déjà :
    • si <Taille> vaut 0 : ce paramètre est ignoré et la taille de la zone peut être obtenue par la fonction fTaille.
    • si <Taille> est différent de 0 :
      • si <Taille> est trop grand, la fonction fMemOuvre renvoie -1.
      • la zone mémoire existante est ouverte avec une taille au moins égale au paramètre (la taille effective est déterminée par le système d'exploitation et peut être connue grâce à la fonction fTaille).
  • Si la zone n'existe pas, elle est créée avec une taille au moins égale au paramètre (la taille effective est déterminée par le système d'exploitation et peut être connue grâce à la fonction fTaille).
<Partage> : Constante optionnelle de type Entier
Mode de partage de la zone entre les sessions utilisateurs :
partageGlobalLa zone est partagée avec toutes les applications de toutes les sessions de la machine.
partageUtilisateur
(Valeur par défaut)
La zone est partagée avec toutes les applications de la session de l'utilisateur.
<Mode d'ouverture> : Constante optionnelle de type Entier
Constantes permettant de définir le mode d'accès à la zone de mémoire partagée.
foEcritureOuverture de la zone en "écriture seule". Il sera uniquement possible d'écrire dans cette zone.
foLectureOuverture de la zone en "lecture seule". Il sera uniquement possible de lire dans cette zone.
Si cette constante est utilisée, pour changer le mode d'ouverture de la zone mémoire, il est nécessaire de fermer la zone mémoire (fonction fFerme) avant de la réouvrir avec un mode d'ouverture différent.
foLectureEcriture
(Valeur par défaut)
Ouverture de la zone en "lecture/écriture". Il sera possible de lire et de modifier cette zone.
foUnicodeOuverture d'un fichier au format UNICODE. (Voir Notes pour plus de détails)
<Procédure WLangage> : Nom de procédure
Nom de procédure WLangage ("callback") qui sera appelée automatiquement si la zone mémoire est modifiée par une autre application en WLangage.
Cette procédure est de la forme :
PROCEDURE <Nom de la procédure>(<Nom de la zone>)

Le paramètre de cette procédure est optionnel. Il doit être utilisé dans le cas où une unique callback est utilisée pour recevoir les notifications de plusieurs zones de mémoire partagées.
Le paramètre <Nom de la zone> sera préfixé par la chaîne "Global\" si la zone a été créée avec la constante partageGlobal et par la chaîne "Local\" si la zone a été créée avec la constante partageUtilisateur.
Remarques

Gestion du mode de partage

Selon les versions des systèmes d'exploitation, le mode de partage diffère :
  • 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 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.
  • Windows : Pour accéder à une zone de mémoire Globale en écriture ou en lecture, il est nécessaire d'avoir les droits d'administrateur.
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);

Gestion des zones mémoires au format UNICODE

La fonction fMemOuvre permet de lire et d'écrire des zones mémoires au format UNICODE "UTF-16" ou "little endian". En ouverture, la marque "Unicode courant" (FFFE) est automatiquement lue. En création, elle est automatiquement ajoutée.
Remarque : Le mécanisme de rappel automatique d'une procédure WLangage à chaque modification de la zone de mémoire par une autre application ne fonctionne que entre des applications en WLangage.

Positionnement dans la zone de mémoire partagée

A l'ouverture d'une zone de mémoire partagée, la position en cours correspond au premier octet de la zone.
Cette position peut être modifiée par la fonction fPositionne.

Fermeture de la zone de mémoire partagée

Lorsque l'application n'a plus besoin d'accéder à la zone de mémoire partagée, l'accès peut être fermé à l'aide de la fonction fFerme. La zone est effectivement détruite une fois que la dernière application y accédant a refermé la zone. Si aucun appel explicite à la fonction fFerme n'est présent dans le code de l'application, la fermeture sera faite automatiquement à la terminaison de l'application.
Composante : wd290std.dll
Version minimum requise
  • Version 15
Documentation également disponible pour…
Commentaires
Cliquez sur [Ajouter] pour publier un commentaire

Dernière modification : 16/01/2023

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