Quel est le meilleur IPC(Inter Processus Communications) sous windows ? [Résolu]

Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Dernière intervention
26 avril 2013
- 8 févr. 2012 à 11:56 - Dernière réponse :
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
- 9 févr. 2012 à 13:48
Bonjour,

Dans le cadre d'échanges de données entre 2 processus écrit en C++, basé sur un seul PC sous Windows.
Ces échanges se font dans les 2 sens, et se font de manière périodique et récurrente. (échange d'une structure contenant des float[], et int[])

Je me demande quel est le meilleur moyen de communiquer (IPC): pour le moment j'ai listé ceci:
- Par fichiers(problème d'accès au fichier en même temps) : pas le top
- Par une base de données (Ok, mais j'imagine long et fastidieux)
- Mémoire partagée (je m'y connais moyen mais cela semble être un bon moyen, mais mise en place fastidieuse (synchronisation lecture/écriture)
- Boost (je ne connais pas encore)
- Sockets ( je connais bien et me demande si c'est le meilleur moyen dans mon cas)

j'aimerais avoir l'avis de gens expérimentés SVP
sur les avantages et inconvénients de chaque moyen. (vu les contraintes citées ci-dessus : 1 seul PC, windows, échange récurrent, structure de données fixe...)

merci


 
Afficher la suite 

Votre réponse

19 réponses

Meilleure réponse
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
- 8 févr. 2012 à 14:58
3
Merci
J'aime bien communiquer par messages...

l'echange de donnée plus conséquent peut se faire par un systeme de mémoire partagée (OpenFileMapping & co), synchronisé par messages...


exemple ici
http://www.vbfrance.com/codes/PARTAGE-VARIABLES_39615.aspx

facilement transposable en C, puisque basé sur des APIs

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp

Merci Renfield 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de Renfield
Meilleure réponse
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
- 8 févr. 2012 à 19:11
3
Merci
La solution la plus simple reste le meilleur gage de la réussite.
Comme dit plus haut par Renfield, un simple échange de messages dans les 2 sens dira quand les données sont dispo et au besoin combien dans le meme message.

ciao...
BruNews, MVP VC++

Merci BruNews 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de BruNews
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Dernière intervention
26 avril 2013
- 8 févr. 2012 à 15:03
0
Merci
Donc tu conseillerais plutôt les pipes ou sockets?
peux-tu STP décrire pourquoi? avantages et inconvénients par rapport à l'utilisation de la mémoire partagée?

Autre point, "echange de données plus conséquent" à quel moment sait-on que c'est devenu conséquent? dans mon cas j'échange une structure avec pas mal de données rattachées...
 
Commenter la réponse de LaTatadu91
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Dernière intervention
26 avril 2013
- 8 févr. 2012 à 16:19
0
Merci
Utiliser la mémoire partagée me semble être assez complexe dans la gestion de la synchronisation ...
là j'hésite entre l'utilisation des sockets (ou pipes)
ou l'utilisation de WM_COPYDATA.

une idée? un conseil avisé?

 
Commenter la réponse de LaTatadu91
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
- 8 févr. 2012 à 17:08
0
Merci
2 processus sur le meme PC, je prendrais le FileMapping quasi à tout coup.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Dernière intervention
26 avril 2013
- 8 févr. 2012 à 18:02
0
Merci
Salut Brunews,

j'ai lu aussi pas mal de choses sur le filemapping Peux tu STP me dire en quoi pour toi c'est la meilleure solution?

merci pour vos réponses


 
Commenter la réponse de LaTatadu91
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Dernière intervention
26 avril 2013
- 8 févr. 2012 à 20:03
0
Merci
j'ai une question, que se passe t-il lors de l'arret d'un des 2 processus? les messages peuvent etre stockés?
et lors de la "reprise" de ce même process?
ps: quand tu dis un échange de message? tu parles tjrs de FileMap?
 
Commenter la réponse de LaTatadu91
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
- 8 févr. 2012 à 20:46
0
Merci
PostMessage().
Un message sous Windows n'est pas "stocké", il est posé sur la pile d'appels du prog.
En cas d'arret d'un des 2 progs, no probleme si le filemap est correctement géré.

Lire Richter (en CHM dans le zip):
http://brunews.com/
Prendre JR4 dans la section 'manuels'.


ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
- 9 févr. 2012 à 07:53
0
Merci
Arrêt d'un des processus, la mémoire reste dispo, un des process gardant un Handle ouvert vers la mémoire partagée...
Même si c'est l'appli qui a "ouvert la zone"

fonctionne avec n processus, autre avantage.

rapide, en plus, souple, controle total sur le contenu de la mémoire...

le pipe ne permettra pas de stocker des donénes dans le temps...

les sockets induiront un controle de reception de l'ensemble des trames...

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Commenter la réponse de Renfield
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Dernière intervention
26 avril 2013
- 9 févr. 2012 à 09:56
0
Merci
Ok merci pour les infos,

est il possible au contraire de ne pas empiler les messages?
dans mon cas précis le message a transmettre correspond à un état d'une map instantané(positions de produits/dimensions de chaque produits/etc). Le second processus lui, doit effectuer des calculs en tenant compte de cet état

donc lors de l'arrêt puis de la reprise de ce second processus, il doit prendre en compte l'état actuel de la map donc le dernier message et si il a été arrêté pendant 2heures (par ex) ne pas faire les calculs pour les 2 h perdues...



 
Commenter la réponse de LaTatadu91
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Dernière intervention
26 avril 2013
- 9 févr. 2012 à 10:00
0
Merci
Aussi , si je comprends bien, vous préconisez un échange via une section partagée (FileMap) mais vous ajouter à cela une communication de type PostMessage entre les 2 applications pour prévenir de la disponibilités des données?
Alors pourquoi ne pas attaché directement ces données dans la communication directe?
comme dans WM_COPYDATA et COPYDATASTRUCT permettant de faire passer une structure ...

http://msdn.microsoft.com/en-us/library/windows/desktop/ms649011(v=vs.85).aspx
 
Commenter la réponse de LaTatadu91
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
- 9 févr. 2012 à 11:06
0
Merci
Empilés, oui, si le process est viable...

dans mon code, les messages sont broadcastés, qui plus est.

pas de soucis pour cette histoire de 2heures, donc

je ne communique pas mes données par le Sendmessage directement parce que je broadcastes les messages, ne ciblant pas une application(fenetre) en particulier...

du coup, je ne veux pas ralentir le systeme en placant trop de données de cette manière.

le second avantage est que les données restent accessibles a tout moment ; tant que je ne viens pas les supprimer ou les modifier


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Commenter la réponse de Renfield
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Dernière intervention
26 avril 2013
- 9 févr. 2012 à 11:29
0
Merci
Ok, je commence vraiment à y voir plus clair (grâce à vous)

donc oui on peut empiler mais peut on au contraire ne pas empiler (genre de timeout qui permettrait au message si il n'est pas reçu/lu d'être effacé)?

Pour le reste Effectivement les avantages sont la rapidité et l’accessibilité des données en permanence.

 
Commenter la réponse de LaTatadu91
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
- 9 févr. 2012 à 11:41
0
Merci
tu te méprend...

les message arrivent, et sont empilés dans la file d'attente des fenetres qui les ont recus...

Ils sont ensuite traités en sequence.

Si ton application n'est pas lancée, elle ne recevra pas ce message, il ne sera stocké nulle part...

Si ton appli recoit un message alors qu'elle calcule, je pense qu'il est de bon ton d'interrompre le calcul, les données ayant changé, non ?

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Commenter la réponse de Renfield
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Dernière intervention
26 avril 2013
- 9 févr. 2012 à 11:47
0
Merci
Effectivement, c'est un cas à prévoir, et il est vrai que le mieux serait de reprendre les calculs avec les nouvelles données.

Que se passe t(il au niveau du sendmessage si mon appli 1 tourne et envoi (cycliquement 1message/min) et que je suis en train de débugguer l'appli 2 (point d’arrêt pendant 15 minutes disons) ?
j'aurai 15 messages à dépiler? (si c'est le cas j'aimerais éviter cela au maximum) et ne prendre en compte que le dernier message.



 
Commenter la réponse de LaTatadu91
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
- 9 févr. 2012 à 11:58
0
Merci
oui, c'est ce qui se passera...
au pire le message peut arriver en n exemplaires...

pas grave

tes données, elles ne changent pas et ne sont pas présentes en n exemplaire...

donc que tu refasse le calcul suite au premier message recu, ou sur celui qui suivait la modification des données, qu'importe.

a toi d'etre malin et ne recalculer que si les données ont changé, par exemple... (en stockant dans les données un horodatage, par exemple...)

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Commenter la réponse de Renfield
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
- 9 févr. 2012 à 12:41
0
Merci
SendMessage() attend un retour, donc bloque, A BANNIR pour de l'inter processus.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Dernière intervention
26 avril 2013
- 9 févr. 2012 à 13:20
0
Merci
Ok renfield , c'est exactement ce que j'avais en tête... vérifier les changements et lancer un calcul ou non.
merci vraiment !
je suis décidé à faire du FileMapping , je vais étudier ton code source VB!

Et Brunews, je tiendrais compte de cela et utiliserait donc Postmessage à la place.

Désormais place au code.

Merci encore.

 
Commenter la réponse de LaTatadu91
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
- 9 févr. 2012 à 13:48
0
Merci
BruNews ;

Il est bien sur question de PostMessage...

ou de la variante avec TimeOut...
par abus de language, j'ai gommé cette distinction dans mes explications

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Commenter la réponse de Renfield

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.