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

Windows Discussion :

Echange processus A <-> threads B


Sujet :

Windows

  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    Par défaut Echange processus A <-> threads B
    Bonjour,

    J'utilise actuellement une API multithreads de rendu 3D, qui existe en version Linux et Windows.

    Le moteur de rendu calcule l'image par morceaux, qu'on appelle "tuiles".

    Mon application utilisant cet API tourne dans son propre processus, et appelle la DLL de ce moteur de rendu, qui a également son processus. Lors d'une demande de rendu, le moteur de rendu crée n threads, et chacun renvoie la "tuile" calculée au processus appelant (mon appli). Sauf que mon appli ne les reçoit jamais...

    Ce comportement malheureux n'a lieu que sous Windows; ça fonctionne très bien sous Linux.

    La question est donc la suivante : dans un environnement Windows, un processus A peut-il dialoguer avec les threads d'un processus B ?

    Merci !

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Il y a tout plein de méthodes de communication inter-processus sous Windows.
    Par contre, on ne sait pas quelle(s) est(sont) la(les) méthode(s) de communication employée(s) par ton moteur de rendu...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    Par défaut
    Voici la ligne de création de thread :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       handle = (HANDLE)_beginthreadex(NULL, 0,
         (unsigned int (__stdcall *)(AtVoid *))fn,
          data,
          CREATE_SUSPENDED,
          &thread_ID );
    fn est la fonction qui doit recevoir le résultat du calcul.
    Je ne pense pas que le reste soit important pour vous.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Je n'ai pas demandé la façon dont était créé le thread (par contre, il est créé dans quel processus et par quoi?).

    De plus, mettre un cast de pointeur de fonction comme ça, c'est vraiment, vraiment crade.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    De plus, mettre un cast de pointeur de fonction comme ça, c'est vraiment, vraiment crade.
    ++1 (et ça sent les problèmes)
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    En plus, ton thread, il est créé dans l'état "suspendu". J'espère que quelqu'un ailleurs pense à le reveiller.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Je n'ai pas demandé la façon dont était créé le thread (par contre, il est créé dans quel processus et par quoi?).
    Le processus A demande au processus B : "Lance moi un rendu en utilisant n threads."
    Le pocessus B crée alors ses threads en bouclant sur le nombre de threads demandé.
    Chaque thread se voit alors affecté une tuile à calculer, et le thread renvoit (ou plutôt essaye...) cette tuile vers le processus B. Mais la communication ne se fait pas, manifestement.

    Citation Envoyé par Médinoc Voir le message
    De plus, mettre un cast de pointeur de fonction comme ça, c'est vraiment, vraiment crade.
    Ca m'avait également paru bizarre qu'il fasse ça. Mais bon, je n'ai pas trop la main sur le code...

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    Par défaut
    Citation Envoyé par ram_0000 Voir le message
    En plus, ton thread, il est créé dans l'état "suspendu". J'espère que quelqu'un ailleurs pense à le reveiller.
    Oui oui. C'est juste parce que juste après la création est settée la priorité du thread. Ensuite, el thread est "résumé".

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Donc, ce code de création, il est dans B ?
    Alors que fait-il avec la fonction "qui doit recevoir le résultat du calcul", comme tu dis?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    Par défaut
    J'ai effectivement dit une grosse connerie.
    fn est la fonction qui effectue le calcul, pas celle qui le reçoit.

    Le moteur de rendu, A, a connaissance d'un pointeur de fonction fnPt.
    Cette information a été "settée" à un moment antérieur, peu importe quand.

    Ensuite, on décide de lancer un rendu :

    - A appelle B, en lui demandant d'utiliser n threads
    - B crée commence une boucle, créant les n threads (B.1, B.2...) en état suspendu
    - dans cette boucle est "settée" la priorité du thread, puis le thread courant est lancé
    - B.k, lorsqu'il a terminé son calcul, passe sa "tuile" à la fonction fnPt définie dans A

    Cette dernière étape fonctionne sous Linux, mais pas sous Windows. Les tuiles ne sont jamais reçues.

    Désolé de ne pouvoir vous filer du code, mais ce n'est pas le mien. Notre fournisseur d'API m'en a gracieusement passé des morceaux, mais je ne suis pas supposé les diffuser... :-(
    Mais comme il n'est guère motivé pour se creuser la tête pour la plate-forme Windows, je fais néanmoins appel à vous. :-)

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Comment est "setté" ce pointeur de fonction, et comment est-il appelé ?
    Je suppose qu'il est mémorisé du côté "bibliothèque chargée dans A" et qu'il est appelé par cette même bibliothèque sur réception d'un "message" de B, non?

    Comment est envoyé ce "message" ? Quelle est la méthode de communication entre A et B ?
    • sockets ?
    • mémoire partagée ?
    • messages Windows ?
    • tubes ?
    • etc.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    Par défaut
    A vrai dire, je ne peux pas répondre à ces questions : je n'ai pas accés au code. Et de toute façon, je n'y connais quasiment rien en programmation multithread. Je n'ai donc pas l'intention de vous demander une solution.

    Je voulais juste m'assurer qu'il était possible que des threads "hébergés" par un processus B pouvaient communiquer avec un autre processus A, ou si la communication pouvait se faire uniquement entre processus.

    Comme le codeur de l'API code surtout du Linux, je m'étais dit qu'il essayait peut-être de copier dans son code Windows un mode de fonctionnement possible uniquement sur Linux. Dans ce cas là, j'essaierai de l'encourager à sérialiser le résultat des calculs avant de les envoyer par le thread principal de B (le processus...).

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Citation Envoyé par oodini Voir le message
    Je voulais juste m'assurer qu'il était possible que des threads "hébergés" par un processus B pouvaient communiquer avec un autre processus A, ou si la communication pouvait se faire uniquement entre processus.
    Cette question est un non-sens: Les threads font partie du processus.
    Chaque processus possède au moins un thread, et la définition même du thread c'est que du code s'exécute. Donc, le code ne s'exécute jamais en dehors d'un thread.
    Comme le codeur de l'API code surtout du Linux, je m'étais dit qu'il essayait peut-être de copier dans son code Windows un mode de fonctionnement possible uniquement sur Linux. Dans ce cas là, j'essaierai de l'encourager à sérialiser le résultat des calculs avant de les envoyer par le thread principal de B (le processus...).
    Eh bien tant qu'on ne sait pas quel moyen de communication inter-processus il utilise, ce ne sera pas évident d'aider...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #14
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Cette question est un non-sens: Les threads font partie du processus.
    Chaque processus possède au moins un thread, et la définition même du thread c'est que du code s'exécute. Donc, le code ne s'exécute jamais en dehors d'un thread.
    Mais le thread minimal auquel tu fais allusion n'a-t-il pas un statut spécial ? Du genre "thread principal", par rapport aux autres threads dotn il demande la création ?

    Citation Envoyé par Médinoc Voir le message
    Eh bien tant qu'on ne sait pas quel moyen de communication inter-processus il utilise, ce ne sera pas évident d'aider...
    Je veux simplement savoir s'il existe un moyen, n'importe lequel, pour qu'on thread "secondaire" d'un processus B envoie des données au thread "principal" d'un processus A.

    Si on est d'accord sur le sens de ma question, un "oui" ou un "non" me suffira. :-)

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Sous Windows en tout cas, y'a pas de thread "principal" ou non, sauf pour certaines choses très particulières qui considèrent le premier thread comme le thread principal (notamment certains objets COM).
    La seule particularité, c'est que si main() retourne, le processus se termine. Mais si le premier thread est interompu de l'intérieur avec la fonction ExitThread(), les autres threads restent en vie et le programme se terminera normalement quand le dernier thread se terminera.

    N'importe quel thread d'un processus peut communiquer avec n'importe quel autre thread d'un processus du même utilisateur.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #16
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    Par défaut
    OK, merci beaucoup !

Discussions similaires

  1. Echange de messages entre 2 threads
    Par VinceCBA dans le forum Concurrence et multi-thread
    Réponses: 3
    Dernier message: 20/08/2012, 15h18
  2. [VB.Net][Threading] Communication entre processus
    Par DonF dans le forum Windows Forms
    Réponses: 2
    Dernier message: 21/02/2006, 15h15
  3. Id de thread (processus léger)
    Par Ipoupaille dans le forum Threads & Processus
    Réponses: 3
    Dernier message: 08/01/2006, 12h14
  4. [Thread]Problème de processus
    Par berg dans le forum Concurrence et multi-thread
    Réponses: 5
    Dernier message: 18/06/2005, 20h40
  5. [SIGNAL] threads et processus
    Par beLz dans le forum POSIX
    Réponses: 14
    Dernier message: 21/12/2004, 01h28

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