p
u
b
l
i
c
i
t
é
publicité
  1. #1
    Invité régulier
    Inscrit en
    septembre 2009
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : septembre 2009
    Messages : 47
    Points : 9
    Points
    9

    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 Expert
    Avatar de white_tentacle
    Inscrit en
    novembre 2008
    Messages
    1 444
    Détails du profil
    Informations forums :
    Inscription : novembre 2008
    Messages : 1 444
    Points : 2 358
    Points
    2 358

    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
    Invité régulier
    Inscrit en
    septembre 2009
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : septembre 2009
    Messages : 47
    Points : 9
    Points
    9

    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 Expert
    Avatar de white_tentacle
    Inscrit en
    novembre 2008
    Messages
    1 444
    Détails du profil
    Informations forums :
    Inscription : novembre 2008
    Messages : 1 444
    Points : 2 358
    Points
    2 358

    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
    Invité régulier
    Inscrit en
    septembre 2009
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : septembre 2009
    Messages : 47
    Points : 9
    Points
    9

    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
    Invité régulier
    Inscrit en
    septembre 2009
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : septembre 2009
    Messages : 47
    Points : 9
    Points
    9

    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
    Invité régulier
    Inscrit en
    septembre 2009
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : septembre 2009
    Messages : 47
    Points : 9
    Points
    9

    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