begin process at 2012 05 27 19:33:36
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Système

 > [WIN32]ECHANGE INTER-PROCESSUS VIA SHAREDMEMORY, MUTEX ET EVENT

[WIN32]ECHANGE INTER-PROCESSUS VIA SHAREDMEMORY, MUTEX ET EVENT


 Information sur la source

Note :
10 / 10 - par 2 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Système Classé sous :SharedMemory, Event, Mutex, mémoire, partage Niveau :Initié Date de création :07/11/2007 Date de mise à jour :07/11/2007 14:30:46 Vu / téléchargé :5 772 / 388

Auteur : rt15

Ecrire un message privé
Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Un petit programme pour répondre à une question, :

http://www.delphifr.com/infomsg_EXECUTER-APPLI- CONSOLE-MM-TPS_1025052.aspx

Il permet de présenter quelques techniques intéressantes.

C'est un chat (Le truc sur internet, pas le machin avec des poils qui trolle). Sauf que là ça marche pas sur internet : les clients (Y a que des clients) doivent se trouver sur le même PC. Cherchez pas un intérêt autre que pédagogique, y en a pas.
Globalement, quand on tape des messages dans la console d'une instance du client, ils sont transmis aux autres instances.

Ce programme fait appel à 4 concepts :

#1 Les threads :

Ce n'est pas l'objet principal de ce source, mais comme j'en parle plus loin... Très connus les threads. Passez à la section suivante si vous avez déjà fait le tour de la question.

Le  processeur exécute des portions de codes. Il exécute les lignes les unes après les autres sans se poser de question, comme quand on fait du débogage pas à pas. Par défaut, une application Delphi a un seul thread. A l'instant t, le processeur ne peut qu'exécuter une seule ligne, et l'instant d'après, il exécutera la suivante. Mais si on crée un deuxième thread, le processeur pourra exécuter simultanément deux lignes de codes (En fait non sur les processeurs qui sont en train de disparaître, mais c'est tout comme).

Dans cette application, le thread principal de l'application attend les entrées utilisateur dans la console. L'appel à ReadLn est dit bloquant. Pourtant, mon application a besoin de détecter quand les autres personnes connectées au chat envoie des message. C'est ça que mon deuxième thread va surveiller.

Dans Delphi, on peut faire des threads de deux manières différentes : soit en utilisant les fonctions de Windows, soit en héritant une classe de la classe TThread. Il n'y a pas de grosse différences entre les deux possibilités, si ce n'est que TThread compile certainement sous Kylix (La version Linux de Delphi), tout en ne pénalisant certainement pas trop les performances tant elle est proche de l'implémentation Windows.

J'ai utilisé TThread, mais pour le reste, je suis passé par du Win32.


#2 Les vues de fichiers (FileMapping) :

Quand on demande à Windows de nous donner une vue d'un fichier, il va nous permettre d'écrire dans ce fichier (Ou des bouts de celui-ci) comme s'il se trouvait dans la RAM.

Dans ce programme, on se sert du FileMapping sans fichier : Windows renvoie une zone mémoire accociée à aucun fichier sur le disque.

On parle alors plutôt de mémoire partagée (SharedMemory). L'avantage de ce type de mémoire est que différents processus vont pouvoir y accéder presque comme si celle-ci avait été allouée par eux.

En effet, chaque processus vit dans son petit monde avec ses 4Go d'espace adressable (Les pointeurs faisant 32bits). Les adresses que l'on utilise son virtuelles et ne sont pas interchangeables entre les processus. Et on ne peut pas non plus retrouver les variables du processus voisin en cherchant dans la mémoire du processus courant. Les SharedMemory se présente donc comme une bonne méthode de partage de données.

D'autres procédés d'échanges de mémoires entre processus existent : on peut par exemple utiliser de simples fichiers, des pipes, les fonctions Read/WriteProcessMemory...

Dans ce programme, les différents processus (Toutes des instances d'un même executable, en d'autre mots, on a double cliqué plusieurs fois sur le .exe), vont mettre les messages dans une SharedMemory. Ainsi, les autres processus pourront afficher les messages dans leurs propres consoles.

Windows nous fournit une zone de la taille que l'on veut, à nous de la gérer. Ca risque de passer par des pointeurs et quelques transtypages bien sentis. Donc faut pas faire n'importe quoi et réfléchir un peu. Dans cette application, j'ai décidé de réserver les 4 premiers octets (Taille d'un integer) pour sauvegarder la taille de la chaîne contenue dans la SharedMemory. La chaîne en elle même se trouve juste après ces 32bits (Voir l'incrémentation du pointeur dans le code). On peut mettre des structures et des tableaux sans problèmes en étant un peu inventif. Pour les objets par contre, faut pas espérer y parvenir sans s'y connaître pas mal (Savoir ce qu'est une vtable par exemple...).


#3 Les évènements (event) :

Les évènements utilisés ne sont pas ceux de Delphi, et pas non plus ceux utilisés quand on parle de programmation évènementielle sous Windows. Simples d'emploi, ils permettent de signaler à des threads des heu... évènements.

Dans notre cas, l'évènement, c'est l'écriture d'un nouveau message dans la SharedMemory. Le deuxième thread va attendre patiemment cette évènement à l'aide d'une fonction très utile qui s'appelle WaitForSingleObject. On aurait pu utiliser un timer mais l'attente sur évènement est bien plus simple et efficace dans ce cas. Le plus dur est de savoir que ça existe...


#4 Les mutexs :

Une mémoire partagée, que ce soit par plusieurs threads d'un même processus, ou par plusieurs processus, ça peut poser problème.

En effet, comme deux thread peuvent s'exécuter en même temps, 2 d'entres eux peuvent essayer d'écrire au même endroit en même temps... Et là le résultat risque de pas être beau à voir.

Pour ceux qui connaissent, les mutexs permettent de faire des sections critiques manuellement. Ils sont moins performant que les sections critiques de Windows, mais celles-ci ne fonctionnent pas entre plusieurs processus.

Les mutexs vont nous permettre de nous assurer que 2 threads ne tentent pas d'accéder au même endroit en même temps. Concrètement, le mutex est un peu comme un jeton dans un verre. Deux personnes peuvent prendre le jeton. Quand l'une à le jeton, l'autre ne peut pas l'avoir aussi. Les mutexs, c'est pareil : on demande au thread de prendre le jeton, ou d'attendre jusqu'à ce qu'il soit disponible.

Cela peut poser problème si une personne qui a le jeton décide de partir boire un pastis avec celui-ci... On peut aussi arriver à des situations assez folkloriques où tout le monde attend attend tout le monde pour continuer son execution. On appele ça les deadlocks. Comme avec les pointeurs, là aussi faut faire un peu gaffe.

PS : Sur le screenshot, c'est pas des citations et faut pas chercher de cohérence. C'est normal que l'on ai l'impression que des messages apparraissent deux fois : une fois quand l'utilisateur les tapes, et une deuxième quand la mémoire partagée est lue.



 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

07 novembre 2007 14:30:47 :
Grammaire, conjugaison et autre ortho...

 Sources du même auteur

Source avec Zip Source avec une capture LIBÉRER LA TAILLE MAXIMALE D'UNE FENÊTRE PAR SUBCLASSING
Source avec Zip Source avec une capture HOOK D'API, INJECTION DE DLL, TABLE D'IMPORT
Source avec Zip Source avec une capture FENÊTRE UN PEU CUSTOMISÉE
Source avec Zip Source avec une capture LE MINIMUM POUR UNE FENÊTRE WIN32
Source avec Zip Source avec une capture RÉDACTEUR D'UNITÉ DE CHARGEMENT DYNAMIQUE DE DLL

 Sources de la même categorie

Source avec Zip Source avec une capture EXEMPLES DE THREADS par Jean_Jean
Source avec Zip LECTURE DE LA MEMOIRE D'UN AUTRE PROCESSUS par Mokost
Source avec Zip Source avec une capture LIBÉRER LA TAILLE MAXIMALE D'UNE FENÊTRE PAR SUBCLASSING par rt15
Source avec Zip Source avec une capture OBSERVATEUR DE PROCESSUS ACTIFS; VPROCESS 1,0 par Neftali
UN SELECTDIRECTORY QUI SE PLACE AU BON ENDROIT par ThWilliam

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture LE CERCLE ENCHANTÉ D'ANDRES GÎT EN NOS MÉMOIRES par Caribensila
Source avec Zip FBCREATEUSER par fbalien
Source avec Zip Source avec une capture MEMORYSTATUS par Christophe67
Source avec Zip Source avec une capture VISIOMEM - AFFICHER VOTRE MÉMOIRE par Bacterius
Source avec Zip Source avec une capture DÉMONSTRATION DE LA GESTION DES OBJETS EN MÉMOIRE PAR DELPHI... par Forman

Commentaires et avis

Commentaire de Loda le 08/11/2007 09:01:34

ho, ça m'as l'air très intéressant tout ça....
je regarderais ça plus tard,

bon code,

Loda

Commentaire de cedricbi le 10/11/2007 13:33:04 10/10

Superbes explications et très interressant.
Bravo !

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

partager de la mémoire [ par mounjetado ] bonjour,existe-t-il un cours complet et détaillé, avec des exemples, sur l'utilisation des objets de synchronisation , tels que mutex, sémaphores, sec Partage de dossier [ par theantho07 ] Bonjour,Je développe sous delphi 7 et je suis sous Windows vista.Je voudrais savoir comment partager un dossier ??Merci d'avance de vos réponses. Problème de Partage [ par theantho07 ] Bonjour,Alors depuis quelques jours je n'arrive toujours pas à acceder à mon partage, je m'explique.Mon code marche bien, il me dit que le partage à b Lecture et écriture en mémoire [ par PHIL63 ] Bonjour à tous et à toutes,Mon souci :J'ai des adresses mémoire pour un logiciel donné et j'aurais besoin d'accèder directement à ces zones mémoire en Acces directe à la mémoire d'une carte SD [ par godardth ] Bonjour,Voici mon problème : je développe une petite application electronique qui utilise une carte SD pour stocker un fichier son (format wave). Ce f alternative au clipboard windows... [ par stender ] Bonjour,J'ai un bout de code, qui permet de faire ceci : copier le contenu d'un Edit1 en clipboard puis le coller là ou se trouve le curseur dans wind numéro de série de USB flash mémoire [ par med1112 ] salut à tous,y a t il un moyen pour obtenir le numéro de série de USB flash mémoire, j'utilise Delphi7.merci partage de bdd access sous delphi7 [ par benalioua1975 ] bonjour, je partage ma bdd access sur un reseau pour que je puisse l'utiliser avec delphije veux que les utilisateur de mon application accede a cette Composant : Affectation d'un évènement à un autre [ par Francky23012301 ] Salut à tous,J'ai un ptit soucis (surement très bète) mais que je n'arrive pas à résoudre :Je vous poste qu'un tout ptit bout du code (ca évitera des Comment optimiser la mémoire [ par jnmchl ] Bonjour,J'ai une application qui semble nécessiter beaucoup de mémoire : je pense celà car chez moi j'ai 1Go de RAM et il tourne sans problème alors q


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,702 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales