Précédent   Forum des professionnels en informatique > C et C++ > C++
C++ Forum d'entraide technique sur le langage C++. Avant de poster -> F.A.Q C++
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/02/2012, 14h26   #1
Invité de passage
 
Inscription : mars 2006
Messages : 87
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 87
Points : 3
Points : 3
Par défaut Echange de données(structures) entre 2 programmes C++ d'une même solution

Bonjour,

J'ai développé il y a quelques temps une "grosse" application en C++ en utilisant les threads (chaque thread étant dédié à une fonction propre)
Par exemple: thread 1 reçoit des messages de l'extérieur (base de données ou autre programme)
thread 2 fait le traitement des messages
Tout fonctionne correctement(sans être parfait)

Je souhaite désormais dissocier mes 2 threads en 2 applis bien distinctes, ce qui me permettra par exemple d'arrêter le thread de traitement (2) tout en laissant le thread 1 recevoir les messages et les stocker pour un traitement ultérieur.

Alors je ne sais pas quel est le meilleur moyen pour faire cela, j'ai penser à utiliser une base de données intermédiaire mais je pense que ce sera trop lourd
les données échangées sont une structure d'entier et de float ....
est il possible de définir une zone mémoire utile à mes 2 programmes? ou autre?
quel est le meilleur moyen, le plus léger (à programmer et au niveau de l'execution) pour faire cela?

merci d'avance pour vos réponses
x2thez est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 15h28   #2
Membre du Club
 
Avatar de Jerome S
 
Homme Jérôme
Développeur informatique
Inscription : août 2011
Messages : 59
Détails du profil
Informations personnelles :
Nom : Homme Jérôme
Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : août 2011
Messages : 59
Points : 69
Points : 69
Pour faire communiquer deux applications entre elles, et chacune soit indépendante (pas besoin de l'autre pour fonctionner), tu n'a pas beaucoup de possibilités : base de données, ou fichier (texte).
A ma connaissance, il n'y a pas tellement d'autres possibilités...
__________________
Dans le monde, il y a 10 types de personnes. Ceux qui comprennent ce message et les autres
Jerome S est déconnecté   Envoyer un message privé Réponse avec citation 03
Vieux 03/02/2012, 15h45   #3
Responsable C++
 
Homme Guillaume Belz
Biochimiste
Inscription : novembre 2008
Messages : 2 904
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Belz
Âge : 36
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Biochimiste
Secteur : Santé

Informations forums :
Inscription : novembre 2008
Messages : 2 904
Points : 13 010
Points : 13 010
Heureusement que si, il existe (beaucoup) de méthodes pour faire communiquer 2 applications entre elles (en fonction des contraintes : mémoire partagée ou distribuée, ordinateurs distants ou local, etc.)
Une petite recherche sur google avec "Inter-process communication". En vrac : boost.interprocess, boost.mpi, réseau (un de mes préférés, c'est facile de passer de local à distant), POSIX, D-BUS (linux only je crois), COM/DCOM/OLE/ (windows only ), etc. etc.
__________________
Vous souhaitez rejoindre l'équipe de bénévoles qui fait vivre Developpez (traduction, rédaction, modération) ? Contactez moi par MP.

Ma page personnelle avec la liste de mes articles - Mon blog sur la programmation des GPU.

Je suis régulièrement sur le chat pour les questions C++/Qt.
gbdivers est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 15h59   #4
Invité de passage
 
Inscription : mars 2006
Messages : 87
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 87
Points : 3
Points : 3
salut, merci pour vos réponses, dans mon cas ce sera toujours sur un seul pc local sous Windows.
Je cherche le meilleur moyen sachant que cette "communication" se fera toujours de la même manière avec le même flux de données (une structure envoyée et une structure reçue)
j'étais en train de lire des articles sur la mémoire partagée.

(dans mon ancien programme basé sur MFC les threads communiquaient entre eux via les PostThreadMessage)

quand tu dis réseau est ton préféré t'entends quoi par réseau?
x2thez est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 16h05   #5
Responsable C++
 
Homme Guillaume Belz
Biochimiste
Inscription : novembre 2008
Messages : 2 904
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Belz
Âge : 36
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Biochimiste
Secteur : Santé

Informations forums :
Inscription : novembre 2008
Messages : 2 904
Points : 13 010
Points : 13 010
Un client et un serveur en local (ou en peer-to-peer ou en broadcast) : tu ajoutes des fonctionnalités de communication réseau (UDP et/ou TCP) et tu communiques en localhsost (IP = 127.0.0.1). Ca prend quelques lignes avec un bibliothèques adéquate (regarde par exemple la doc de Qt : serveur et client)

Pour la mémoire partagée, attention : 2 threads utiliseront une mémoire partagée (donc pas de problème) par contre, 2 processus auront des mémoires séparée et une tentative d'accès par l'un sur la mémoire de l'autre provoquera un memory acces violation (je crois)
__________________
Vous souhaitez rejoindre l'équipe de bénévoles qui fait vivre Developpez (traduction, rédaction, modération) ? Contactez moi par MP.

Ma page personnelle avec la liste de mes articles - Mon blog sur la programmation des GPU.

Je suis régulièrement sur le chat pour les questions C++/Qt.
gbdivers est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 16h19   #6
Invité de passage
 
Inscription : mars 2006
Messages : 87
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 87
Points : 3
Points : 3
Ok super pour la mémoire partagée... j'étais en train de me dire qu'effectivement ça semblait être au sein d'une seule application.
Pour tout ce qui est des communications réseaux TCP/IP etc ... je connais parfaitement
je n'y avais pas pensé en premier car pour moi ça me semblait un poil lourd, et je voulais m'assurer qu'il n'y ait pas une solution plus simple et plus rapide.

Seul hic par rapport à cela : un des cas qui me pousse à vouloir scinder en deux mon programme est : en mode production(arrivée constante de messages) j'aimerais pouvoir débogguer la partie "traitement de message" avec des points d'arret et tout ce ci sans provoquer la perte de message du thread "COM" ...
Donc si je débogue et que je prends mon temps, je perdrai ma communication interne (entre mes 2 processus) non?
x2thez est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 16h32   #7
Responsable C++
 
Homme Guillaume Belz
Biochimiste
Inscription : novembre 2008
Messages : 2 904
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Belz
Âge : 36
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Biochimiste
Secteur : Santé

Informations forums :
Inscription : novembre 2008
Messages : 2 904
Points : 13 010
Points : 13 010
Euh... je maîtrise pas assez les débogueurs en multithread, mais pour moi, si tu débogues, tu stoppes tous les threads de l'application et donc tu ne peux plus recevoir de message du tout (quelque soit la méthode choisie : IPC, MPI, réseau, etc.)
Une solution (plus safe) est que le serveur ne supprime un message que lorsqu'il a reçu un accusé de réception du client. Sinon les messages peuvent être stockés et envoyés dès que la connexion est rétablie (circular buffer pour éviter la saturation ?)
__________________
Vous souhaitez rejoindre l'équipe de bénévoles qui fait vivre Developpez (traduction, rédaction, modération) ? Contactez moi par MP.

Ma page personnelle avec la liste de mes articles - Mon blog sur la programmation des GPU.

Je suis régulièrement sur le chat pour les questions C++/Qt.
gbdivers est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 16h38   #8
Invité de passage
 
Inscription : mars 2006
Messages : 87
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 87
Points : 3
Points : 3
en fait le message envoyé correspond à une "map" donc il n'est pas grave de ne pas pouvoir envoyé des messages pendant un certain laps de temps
le second processus lorsqu'il sera "relancé" récupérera la map tel qu'elle est à ce moment là!

ça devrait le faire!

effectivement le débug multithread j'ai du mal et je pense comme toi que l'on stoppe tous les threads...

merci encore
x2thez est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 17h12   #9
Membre éprouvé
 
Homme Eric
Inscription : décembre 2010
Messages : 254
Détails du profil
Informations personnelles :
Nom : Homme Eric
Localisation : France

Informations forums :
Inscription : décembre 2010
Messages : 254
Points : 450
Points : 450
En ce qui concerne la mémoire partagée, je crois que c'est possible entre deux processus distincts, mais ça dépend de l'OS...
therwald est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h17.


 
 
 
 
Partenaires

Hébergement Web