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 :

[C#-Avis] Communication Inter-Process depuis un meme executable ?


Sujet :

C#

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Par défaut [C#-Avis] Communication Inter-Process depuis un meme executable ?
    Bjr,

    J'ai un pti problème,

    j'ai une application qui se lance sur une machine et qui recoit en argument X ensuite elle fait un traitement..., je dois maintenant en lancant une nouvelle fois cette application lui passer un argument Y....

    J'ai envie que ce soit le premier processus qui prenne la main... donc je dois en gros verifier si je suis deja lancé, si OUI, alors je dois lui donner mon argument Y, et quitter...

    Je crois que c'est de la communication inter-process ?
    Le shared memory serait il une bonne solution ?

    Je precise que la communication est sur deux "process" issue d'un meme executable sur une machine locale

    si quelqu un a des mots clés... ou des conseils je suis preneur

    merci

  2. #2
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    tu n'es pas clair sur ce que tu veux faire.
    Ton process est lancé.
    Que veux tu faire ?
    l'arrêter et le relancer ?
    ou le lancer un second process et arrêté le premier ?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Par défaut
    ced600

    arf... désolé de pas etre clair, je vais essayer de reformuler:


    - la scene se passe sur une seul machine, avec un meme executable:

    J'ai toto.exe (pid:1) qui se lance une premier fois, il fait son traitement, il est tjs actif


    J'ai toto.exe (pid:2) qui se lance une deuxieme fois (alors que toto.exe (pid:1) est toujours actif), il voit des le debut que toto.exe est deja present sur la machine, il doit donc lui envoyer un "MESSAGE" et quitter


    toto.exe (pid:1) lit le "MESSAGE" et fait son traitement...


    Je pense que le shared memory peut etre adapté ? par contre je suis obligé de surveiller avec un timer si son contenu a changé ? ou existe t il une meilleurs solution ?

  4. #4
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    la shared memory me semble adapté. J'ai en tête des solutions moins propre mais c'est moins propre.

    Pour qu'un programme sache que quelque chose a changé, il n'a que deux moyen :
    - Il surveille la chose (donc en général un timer derrière).
    - Il attend que quelque chose lui dise qu'il y a eu du changement (interception, event, ou message d'un autre processus).

    Tu peux toujours essayer de t'amuser avec les interceptions, et aller voir en mémoire ce qu'il se passe lorsque tu reçois une interception. Si je ne me trompe pas, windows utilise PosX pour les interceptions.
    Bon courage si tu choisis cela (en Unix, ou Linux, c'est pas très compliqué, mais avec windows qui nous masque un peu tout cela ...)

    Un timer qui vérifie toutes les 500 ms me semble suffisant. Enfin cela dépend du temps de réaction que tu dois avoir.

  5. #5
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    salut

    j'ai posté hier un bout de code qui permet de faire de la shared memory
    (ca doit etre le thread interprocess... ou un truc comme cela, plutot
    recent dans la liste )

    Tu devrais trouver toutes les réponses à tes questions dans ce thread

    The Monz, Toulouse

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Par défaut
    Merci à vous deux pour vos précieux conseils !

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Par défaut
    Citation Envoyé par theMonz31 Voir le message
    salut

    j'ai posté hier un bout de code qui permet de faire de la shared memory
    (ca doit etre le thread interprocess... ou un truc comme cela, plutot
    recent dans la liste )

    Tu devrais trouver toutes les réponses à tes questions dans ce thread

    The Monz, Toulouse

    Hum... il n'y a pas moyen de faire du shared memory juste en utilisant l'API windows ?

    je crois que le mec utilise un hook non ?

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Par défaut
    si quelqu un vois une alternative au shared memory... je suis preneur


    y a pas un system de message en local ?

  9. #9
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    non non

    le hook, c'est une technique qui consiste à s'inscrire à une chaine de fonction qui sont appelés par l'OS ou bien à re-router des fonctions de traitements vers les tiennes

    La, c'est pas du Hook, mais un Wrapper (un adaptateur qui permet d'utiliser en C# des fonctions C++ ou de l'Api Win32 plus facilement)..

    Donc, cela ne me semble pas problématique

    Apres, sur l'autre thread, une réponse a donné la liste des éléments disponibles pour faire de la communication inter-process

    Je pense qu'il faudrait faire une FAQ ou bien un tutoriel sur l'ensemble des techniques disponibles car la question est récurrente ces derniers jours

    The Monz, Toulouse

  10. #10
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Bonjour,

    Une possibilité en utilisant les socket IP:
    • PidB crée un socket IP client qui essaye de se connecter au socket IP server créé par PidA,
    • si la connexion de PidB à PidA réussit, Pid B envoie son message sur la socket et s'arrète,
    • si la connexion de PidB à PidA échoue, Pid B crée le socket server, détectera les connections de PidC, PidD,... et pourra lire leurs messages.


    Sur la même machine :
    - host=127.0.0.1
    - port= nnnn (usuellement 0x4000 à 0x4100)

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Autre option, utiliser une MessageQueue... j'ai jamais fait, donc je connais pas les possibilités, mais en regardant la doc ça me semble être une bonne façon de faire...
    Ou encore le remoting en utilisant un IpcChannel... (jamais testé non plus)

  12. #12
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    j'ai posté hier un bout de code qui permet de faire de la shared memory
    (ca doit etre le thread interprocess... ou un truc comme cela, plutot
    recent dans la liste )
    Je fais le lien :
    http://www.developpez.net/forums/sho...d.php?t=481974

    On y parle déjà, si je me souviens bien, de MessageQueue, et d'autre chose.

    Je pense qu'il faudrait faire une FAQ ou bien un tutoriel sur l'ensemble des techniques disponibles car la question est récurrente ces derniers jours
    En effet cela serait une bonne idée.

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Par défaut
    merci pour vos nombreux commentaires.

    Parait il, qu'on peut utiliser un objet de synchronisation avec un thread special, qui correspond bien a ma demande (envoie de données intra processes, sur une meme machine)

    si quelqu un a des infos la dessus....

  14. #14
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    effectivement, il y a les mutex et les sémaphores, mais je suis pas sûr que ça permette de transmettre des données...

  15. #15
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    C'est meme certains

    Mutex, semaphore sont des objets de synchronisations dont l'existence remonte aux temps anciens (unix, ya beh 15 ou 20ans)

    La seule utilité de ces deux concepts est de limiter l'acces à des ressources et d'etre un moyen de synchronisation eventuel

    The Monz, Toulouse

  16. #16
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Les mutex et les semaphores existent pour bloquer et débloquer des threads en fonction de la disponibilité ou de l'existence d'une ou plusieurs ressources communes qu'utilisent ces threads.

    Edit : J'avais oublié le mot essentiels

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Par défaut
    hum.... question coconne...

    quelqu un m'a dit qu'on pouvait le faire à travers des threads

    il m'a parlé d'EventWaitHandle... http://msdn2.microsoft.com/fr-fr/lib...le(VS.80).aspx


    c'est possible de faire communiquer deux process à travers des threads ??

  18. #18
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Citation Envoyé par alavoler Voir le message
    hum.... question coconne...

    quelqu un m'a dit qu'on pouvait le faire à travers des threads

    il m'a parlé d'EventWaitHandle... http://msdn2.microsoft.com/fr-fr/lib...le(VS.80).aspx


    c'est possible de faire communiquer deux process a travers des threads ??
    pas clair.

    Tu peux faire communiquer des threads entre eux.
    Tu peux lancer des process à partir de thread.
    Mais cela reviendra au même problème pour tes deux process, qu'ils soient lancés par des threads ou autrement il faut prévoir un moyen de communiquer entre eux, à moins que tes threads soient les process eux même.

    Dans ton cas, lorsque tu veux lancer un autre process toto, plutot que de lancer un process, tu peux demander à ton application de lancer un thread qui ne serait autre que le même programme que le thread principale.
    Mais je ne sais pas si c'est plus simple, et de toute façon tu devra prévoir la communication entre tes threads.

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Par défaut
    Vous pouvez en fait allez plus loin puisque la classe WaitHandle dérive de la classe MarshalBy-
    RefObject. Ainsi un objet de synchronisation peut être partagé entre plusieurs processus de
    machines différentes qui communiquent avec la technologie .NET Remoting.
    ced600
    Ca confirme ce que tu dis, grr.... c'est un probleme chiant, parceque revenir à communiquer à travers un protocol reseau, c'est un peu concon en local je trouve, de plus ca peut poser des problemes de firewall...

    ralala...

    enfin merci beaucoup, vous etes fortiches ! Ce forum est plutot sympa !

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/08/2009, 11h42
  2. Communication inter process
    Par thegitch dans le forum C#
    Réponses: 9
    Dernier message: 03/07/2009, 13h23
  3. Communication Inter Process C# C++
    Par Moustico dans le forum C++/CLI
    Réponses: 3
    Dernier message: 13/03/2009, 13h49
  4. votre avis (inter process)
    Par giova_fr dans le forum C#
    Réponses: 9
    Dernier message: 30/01/2008, 10h48
  5. WMI pour communication inter process
    Par dominoz dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 20/08/2007, 13h53

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