|
|
|
|
- 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
Zones de mémoires partagées
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. 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). | fLit | Lit :- 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.
| fLitLigne | Lit une ligne dans un fichier externe (au format ANSI ou UNICODE). | fPositionne | Renvoie 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.
Liste des exemples associés :
|
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.
|
Documentation également disponible pour…
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|