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

Langage C++ Discussion :

communication entre processus


Sujet :

Langage C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Points : 40
    Points
    40
    Par défaut communication entre processus
    Bonjour,

    Voilà j'ai d'un côté un processus, un jeu de plateformes ( http://tuxworld.tuxfamily.org). Processus A

    Et de l'autre côté un processus qui détermine la position des mains du joueur à l'aide de la kinect Xbox. Processus B

    Question 1 :

    Maintenant j'aimerais que le processus A questionne le processus B sur les coordonnées des mains du joueur. Mais il faut que ce soit rapide et efficace, pas de temps mort. Donc j'hésitais entre un échange de messages asynchronisés entre les processus , et faire une zone de mémoire partagée avec mutex. C'est quoi le mieux ? Si vous avez d'autres idées suis preneur.

    Question 2 :

    On peut forcer le système d'exploitation à partager les processus suivant les coeurs du processeur ?
    Genre Core 1 -> processus A
    Core 2 -> processus B

    PS suis sous linux.

    Merci

  2. #2
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Dans un premier lieu, j’utiliserai dbus. C’est assez facile à mettre en œuvre avec les bindings qt ou la glib, et tu peux faire des appels asynchrones.

    Pour ta deuxième question, c’est presque un non-sens : laisse l’os gérer ça, les cas où tu sauras le faire mieux que lui sont extrêmement rares.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Points : 40
    Points
    40
    Par défaut dbus
    Merci,

    Bon je me suis lancé dans dbus / glib. J'ai un peu galéré niveau librairies et fichiers entêtes dans mon cmake mais c'est résolu.

    Par contre j'ai du mal à trouver des exemples et des tutoriaux. Je me suis basé là dessus, mais j'ai un horrible segfault.

    http://www.ibm.com/developerworks/li...bus/index.html

    Des sites sympas pour apprendre à envoyer des messages avec dbus ?

  4. #4
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Je te conseille, sauf si tu as une très bonne raison de ne pas le faire, d’utiliser les bindings qt. À défaut, rabats-toi sur la glib, mais ne fais pas du dbus natif --> ça ne servira qu’à te compliquer la vie.

    Pour quelques exemples : http://doc.qt.digia.com/stable/intro-to-dbus.html

    http://dbus.freedesktop.org/doc/dbus-tutorial.html

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Points : 40
    Points
    40
    Par défaut threads
    Merci,

    J'ai un peu bossé sur dbus, avec qt c'est mort car la librairie est trop lourde juste pour dbus, j'ai préféré glib. Merci je dormirais moins bête ce soir.

    Cependant pour résoudre mon problème je vais faire plus simple, lancer un thread avec mutex, plutôt que de complier deux programmes totalement séparés.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Points : 40
    Points
    40
    Par défaut problème
    Maintenant je me retrouve avec un problème, j'ai l'impression que mon mutex ne marche pas :-(

    J'ai les deux threads qui verrouillent en même temps :
    J'ai à l'écran K L, puis M L

    Merci

    Main.cpp

    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
     
    pthread_mutex_t mutex; // variable globale
     
          if(th.lock()) {
    printf("M L\n");
     
     
             for(unsigned k = 0; k < 640*480*3; k += 3) {
                matrix_partitions[k] = 0;
                matrix_partitions[k+1] = 0;
                matrix_partitions[k+2] = 0;
     
                if(partitions.at(k / 3)) {
                   if(partitions.at(k / 3) == id_max)
                   matrix_partitions[k] = 255;
                }
            }
    printf("M U\n");
             th.unlock();
          }
    kinect.cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if(th.lock()) {
     
    printf("K L\n");
    id_max = Om_h.bigger();
    partitions = Om_h.partitions();
    printf("K U\n");
    th.unlock();
    }
    thread.cpp :

    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
    26
    27
    28
    29
    30
    31
     
     
    CThread::CThread(void *(*function)(void *))
    {
     
       mutex = PTHREAD_MUTEX_INITIALIZER;
       thread.push_back(0);
     
       try {
               if(pthread_create(&thread.back(), NULL, (void *(*)(void *))function, NULL) < 0)
    //       thread = SDL_CreateThread((int (*)(void *))function, NULL);
    //       if(thread == NULL)
                  throw string("thread.cpp : Can't create the thread");
       }
       catch(string caught) {
          cerr << caught << endl;
          throw;
       }
     
    }
     
    bool CThread::lock() {
       if(pthread_mutex_trylock(&mutex) != EBUSY)
          return true;
     
       return false;
    }
     
    void CThread::unlock() {
       pthread_mutex_unlock(&mutex);
    }

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Points : 40
    Points
    40
    Par défaut j'ai trouvé
    Ha j'ai trouvé, en dehors des mutex mon thread accédait au même vecteur que le thread parent.

    En fait j'avais omis le fait que
    vector<float>a, b;

    puis faire un a = b. Ca ne clone pas les vecteurs, donc je suis passé par a.assign(...) et ça marche beaucoup mieux.

Discussions similaires

  1. [C#]Communication entre processus
    Par ShamSS dans le forum C#
    Réponses: 5
    Dernier message: 28/02/2009, 19h39
  2. communication entre processus
    Par gerard tarquin dans le forum Général Python
    Réponses: 12
    Dernier message: 13/06/2007, 12h29
  3. [VB.Net][Threading] Communication entre processus
    Par DonF dans le forum Windows Forms
    Réponses: 2
    Dernier message: 21/02/2006, 15h15
  4. Lecture standard et communication entre processus!
    Par Tartar Ukid dans le forum C++Builder
    Réponses: 5
    Dernier message: 05/07/2003, 16h37
  5. Communication entre processus
    Par markopolo dans le forum C++Builder
    Réponses: 2
    Dernier message: 26/06/2003, 16h21

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