IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Communication entre 2 programmes (débutant)


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2005
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 44
    Points : 31
    Points
    31
    Par défaut Communication entre 2 programmes (débutant)
    Salut
    Je cherche à faire communiquer deux programmes.
    Je voudrais envoyer que le premier programme puisse envoyer un signal au deuxième. Pour cela, je crée un Event dans le premier programme et j'attend dans le deuxième programme avec WaitForSingleObject mais ça ne marche pas.
    Code du programme 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    #include <winsock.h>
    #include <stdio.h>
     
    int main(int argc, char* argv[])
    {
     
    	HANDLE test;
     
                // création de l'évènement
    	test=CreateEvent(NULL,FALSE,TRUE,"evene");
     
    	DWORD wait;
     
                // test pour vérifier que le programme 1 voit l'évènement
    	wait=WaitForSingleObject(test,400);
     
    	if(wait==WAIT_OBJECT_0)
    		printf(" bon \n");
    	else 
    		printf("pas bon \n");
     
    	CloseHandle(test);
    	return 0;
    }
    Code du programme 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
     
    #include <winsock.h>
    #include <stdio.h>
     
    int main(int argc, char* argv[])
    {
     
    	HANDLE test;
     
    	DWORD toto;
     
                // attente de l'évènement
    	toto=WaitForSingleObject(test,400);
     
    	if (toto==WAIT_OBJECT_0)
    			printf("evenement recu \n");
    		else
    			printf("evenement pas recu\n");
     
    	return 0;
    }
    Le problème est que le programme 2 ne reçoit pas l'évènement.

    Merci de votre aide

  2. #2
    Membre actif Avatar de Rupella
    Inscrit en
    Février 2005
    Messages
    286
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 286
    Points : 257
    Points
    257
    Par défaut
    forcément que ca ne marche pas !
    toto dans le prog 2 n'est pas initialisé, tu ne peux pas connaître sa valeur, et
    surtout pas sa valeur dans un autre programme. pour communiquer entre threads d'un meme programme, ok, mais pas entre plusieurs programmes.

    il y a d'autres possibilités de communications entre process (tubes nommés...)

  3. #3
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    Je ne connais pas "<winsock.h>" , "CreateEvent", ou "WaitForSingleObject".

    Il existe quelquechose de normalisé pour la communication entre les processus:
    - les Inter Process Communication (IPC) Posix.

    Ce sont:
    - les file de messages;
    - les objets mémoires;
    - les semaphores.

    Par contre je sais pas à quel point c'est bien implémenté sous windows...

    http://en.wikipedia.org/wiki/POSIX
    http://en.wikipedia.org/wiki/Inter-p..._communication

  4. #4
    Membre actif Avatar de Rupella
    Inscrit en
    Février 2005
    Messages
    286
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 286
    Points : 257
    Points
    257
    Par défaut
    Toutes ces choses la sont implémentées dans l'API 'native' de Windows.
    Il suffit de trouver les fonctions idoines.

    Sur MSDN, faire une recherche CreateNamePipe() ou CreateMailslot().

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Tu n'initialises pas ton Event dans le second programme.

    Moi, pour faire communiquer deux programmes, j'ai tendance à utiliser des programmes en mode fenêtré, avec le message WM_COPYDATA qui est dédié à la communication inter-processus...

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    les pipes nommés c'est pas mal aussi ,
    voir ce post pour exemple d'implementation:
    http://www.developpez.net/forums/sho...449#post331449

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    communication entre deux processus sur Windows === COM

    de la meme maniere Excel peut etre manipuler depuis un autre programme
    -> c'est COM
    et c'est natif sur .NET et tres facile en VB 6

  8. #8
    Membre actif Avatar de Rupella
    Inscrit en
    Février 2005
    Messages
    286
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 286
    Points : 257
    Points
    257
    Par défaut
    Mettre en place un serveur et un client COM pour faire ce genre de choses est relativement fastidieuse, alors que des solutions plus simples sont disponibles...

    Envoyer un message WM_COPYDATA et le trapper est bcp bcp plus simple tout de même

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    en C++ oui c'est tres fastidieux mais en VB6 ou .NET ????
    c'est vraiment simple et autrement plus puissant et evolutif qu' un message .... quand meme !?

  10. #10
    Nouveau membre du Club
    Inscrit en
    Septembre 2005
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 44
    Points : 31
    Points
    31
    Par défaut
    Merci de vos réponses.
    Je vais donc utiliser la fonction PostMessage (je n'ai pas besoin d'attendre la réponse du programme qui recoit le message) mais le problème est que je ne sais comment identifier le handle du programme qui reçoit le message ?
    Pour récupérer le message, je pense utiliser une boucle avec la fonction PeekMessage qui n'est pas bloquante.

  11. #11
    Membre averti
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    Points : 403
    Points
    403
    Par défaut
    Citation Envoyé par epsilon68
    en C++ oui c'est tres fastidieux mais en VB6 ou .NET ????
    c'est vraiment simple et autrement plus puissant et evolutif qu' un message .... quand meme !?
    S'il pose la question dans le forum C++ c'est qu'on suppose qu'il programme en C++ et pas en VB ou .Net

    Sinon moi j'ai toujours un faible pour les sockets, donc bon..Après ça dépend de toi

  12. #12
    Membre éclairé
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Points : 785
    Points
    785
    Par défaut
    c'est pas le langage qui fait qu'une technologie soit plus puissante ou pas.

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Je crois que WM_COPYDATA ne peut se faire correctement qu'avec SendMessage().
    Et pour ça, il faut obligatoirement avoir une fenêtre (visible ou non), car un message envoyé avec SendMessage() est passé à la fenêtre avant même que PeekMessage() retourne.

  14. #14
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    Citation Envoyé par Neo41
    S'il pose la question dans le forum C++ c'est qu'on suppose qu'il programme en C++ et pas en VB ou .Net
    tu fais ton programme en C++, frontend en C, et fais un wrapper COM en VB ou .NET.

    super facile et evolutif.

    a vous de voir...

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Citation Envoyé par epsilon68
    tu fais ton programme en C++, frontend en C, et fais un wrapper COM en VB ou .NET.
    super facile et evolutif.
    a vous de voir...
    J'ai vu, merci. Et je vote non.
    3 langages mélés plus une surcouche COM pour le plaisir d'envoyer un signal d'un processus vers un autre n'est pas une solution satisfaisante. Et ça n'est surement pas le moyen de faire un programme 'facile' et 'évolutif'.

    La communication inter-processus dépend du système. Sous windows l'OP dispose d'une
    solution correcte (au difficultées de programmation près). A priori, tout est dans MSDN au rayon 'synchronization' avec une floppée de lignes de codes en exemple (cf http://msdn2.microsoft.com/en-us/library/ms686915.aspx
    http://msdn2.microsoft.com/en-us/library/ms686353.aspx).

  16. #16
    Membre actif Avatar de Rupella
    Inscrit en
    Février 2005
    Messages
    286
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 286
    Points : 257
    Points
    257
    Par défaut
    je suis d'accord, d'autant plus qu'il existe une api faite exprès pour, que ce soit sous windows ou linux.

    Les api concernant les ipc existent et sont éprouvées, pourquoi s'embêter à réinventer la roue ?

    et si IPC == COM, comment ça marche sous linux ?
    non, franchement, faut arrêter

  17. #17
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    si tu fais du COM (finalement comme tous les outils qu'on trouve sur le marché) tu pourras controler ton programme en appelant des fonctions precises et de n'importe quel language de programmation.

    Sous linux il y avait DCOP sous KDE et maintenant DBUS.

    Sinon il y aura toujours les sockets mais ce n'est meme pas evident avec les firewall qui interdisent souvent les programmes de se mettre en server. Aussi il faut tout recoder le marshalling / unmarshalling des données, ce qui de nos jours est un peu une perte de temps.

    bref envoyer un message (WM_XXX) c'est un workaround pour surement un probleme tres precis, je ne critique pas ce choix mais ce n'est certainement pas une methode "serieuse" ni "robuste" ... a mon avis !

  18. #18
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    Citation Envoyé par Jan Rendek
    A priori, tout est dans MSDN au rayon 'synchronization' avec une floppée de lignes de codes en exemple (cf http://msdn2.microsoft.com/en-us/library/ms686915.aspx
    http://msdn2.microsoft.com/en-us/library/ms686353.aspx).
    tu confondrais pas synchronisation entre threads et entre processus ?
    et synchronisation avec envoi de message ?

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Citation Envoyé par epsilon68
    tu confondrais pas synchronisation entre threads et entre processus ?
    et synchronisation avec envoi de message ?
    Non. Les événements peuvent être nommés et servir de mode de communication entre 2 processus

  20. #20
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    Citation Envoyé par Jan Rendek
    Non. Les événements peuvent être nommés et servir de mode de communication entre 2 processus
    ... mais est-ce qu'on peut alors parler de communication ?
    on ne compare pas COM / DBUS et des evenements de synchronisation

    ... quand meme !

Discussions similaires

  1. Communication entre deux programmes Java. http ? Rmi ? WS ? Autres ?
    Par tiboudchou dans le forum Entrée/Sortie
    Réponses: 8
    Dernier message: 26/03/2009, 12h50
  2. communication entre deux programmes
    Par Invité dans le forum C
    Réponses: 19
    Dernier message: 12/10/2008, 12h07
  3. communication entre un programme et un service
    Par dvince38 dans le forum C++
    Réponses: 4
    Dernier message: 28/01/2008, 10h42
  4. Communication entre 2 programmes
    Par ophalia dans le forum C#
    Réponses: 10
    Dernier message: 20/08/2007, 16h48
  5. Débutant, Communication entre deux programmes
    Par Madalen dans le forum Langage
    Réponses: 5
    Dernier message: 23/05/2007, 22h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo