LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 2013
-
8 févr. 2012 à 11:56
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 2021
-
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...)
BruNews
Messages postés21041Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 8 févr. 2012 à 19:11
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.
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 20131 8 févr. 2012 à 15:03
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...
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 20131 8 févr. 2012 à 16:19
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é?
Vous n’avez pas trouvé la réponse que vous recherchez ?
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 20131 8 févr. 2012 à 20:03
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?
BruNews
Messages postés21041Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 8 févr. 2012 à 20:46
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'.
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202172 9 févr. 2012 à 07:53
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...
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 20131 9 févr. 2012 à 09:56
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...
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 20131 9 févr. 2012 à 10:00
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 ...
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202172 9 févr. 2012 à 11:06
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
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 20131 9 févr. 2012 à 11:47
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.
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 20131 9 févr. 2012 à 13:20
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.