2009-02-23 6 views
4

J'utilise un objet pour démarrer le thread boost et il a quelques variables membres publiques que je modifie dans le thread (dans l'opérateur()). Comment puis-je accéder aux variables membres de l'objet depuis l'extérieur du thread?accéder à la variable membre de l'objet thread boost

J'ai essayé d'utiliser un mutex (défini dans la classe de l'objet) qui est verrouillé dans l'opérateur() de l'objet et de l'extérieur, mais cela ne semble pas fonctionner.

Voici le code objet thread:

struct Mouse 
{ 
    int x, y; 
    string port; 

    boost::mutex mutex; 

    Mouse(const string& p) : port(p) { x = y = 0; } 
    Mouse(const Mouse& m) : mutex() { x = m.x; y = m.y; port = m.port; } 

    void operator()() 
    { 
    ifstream ifs; 
    ifs.open (port.c_str(), ios::binary); 
    if (!ifs.is_open()) 
    { 
     cout << "Impossible d'ouvrir " << port.c_str() << "\n"; 
     exit(0); 
    } 
    while (true) //modify x, y in infinit loop 
     { 
    char buf[3]; 
    ifs.read(buf, 3); 
     unsigned char * msg = (unsigned char *) buf; 
    unsigned char xsign = (msg[0]>>4) & 1; 
    unsigned char ysign = (msg[0]>>5) & 1; 
     unsigned char always1 = (msg[0]>>3) & 1; 
    short dx = msg[1] - 256*xsign; 
    short dy = msg[2] - 256*ysign; 
    { 
     boost::mutex::scoped_lock lock(mutex); 
     x += abs(dx); 
     y += dy; 
    } 
     } 
    } 
}; 

Et c'est là que je tente d'accéder à des variables x et y de la souris:

{ 
    boost::mutex::scoped_lock leftlock(leftMouse.mutex); 
    xLeft = leftMouse.x; 
    yLeft = leftMouse.y; 
    } 
    { 
    boost::mutex::scoped_lock rightlock(rightMouse.mutex); 
    xRight = rightMouse.x; 
    yRight = rightMouse.y; 
    } 
    cout << xRight << " " << yRight << endl; //this always prints 0 0 
+0

Pourriez-vous s'il vous plaît poster un code pour voir exactement comment cela ne fonctionne pas? –

Répondre

10

boost::thread copie la fonction de fil passé au stockage interne, donc si vous démarrez votre fil comme celui-ci, le fil fonctionnera sur une autre copie de mouse:

int main() { 
    Mouse mouse("abc.txt"); 
    boost::thread thr(mouse); // thr gets a copy of mouse 
    ... 
    // thread changes it's own copy of mouse 
    ... 
} 

Vous pouvez utiliser boost::ref pour passer un référence à un objet existant au lieu:

Mouse mouse("abc.txt"); 
    boost::thread thr(boost::ref(mouse)); // thr gets a reference of mouse 

Dans ce cas thr modifiera lamondialeobjet, mais vous devez vous assurer que mouse ne sort pas de la portée ou se détruit sinon avant que est terminée.

0

OK, maintenant je le vois plus clair. Quelques conseils en regardant votre code:

  1. Ne pas exposer les mutex internes.
  2. Ecrit des opérations d'accès qui verrouillent et déverrouillent le mutex. De cette façon, vous n'avez pas besoin de relayer l'utilisateur de votre classe pour verrouiller (et déverrouiller) efficacement le mutex.
  3. Lire les données du fichier avant le fil. La lecture est probablement bloquante ou trop lente pour que l'autre thread obtienne les données. Si vous lisez les données avant, puis démarrez le thread, toutes les données seront lues au moment où les clients accèdent aux données du thread.
Questions connexes