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

Boost C++ Discussion :

boost.thread utiliser un functeur


Sujet :

Boost C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    410
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 410
    Par défaut boost.thread utiliser un functeur
    Salut,
    J'avous que je me met à boost depuis peu (mieux vaut tard que j'amais). Je m'interesse en particulier à ce qu'on peu faire avec boost.thread. Je voulais créer un bout de code qui a le comportement suivant:

    mon header:
    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
     
    class Task
    {
    private: 
        //members...
    publics:
        // ctor and dtor
        Task(/*init members*/){}
        ~Task(){}
     
        void operator()()
        {
            // Task to do....
        }
    };
    mon fichier source:
    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
     
    // includes....
     
    int main()
    {
        Task task1(/* parametres1 */);
        Task task2(/* parametres2 */);
     
        // C'est ici que je ne vois pas comment les passer !!!
        boost::thread my_thread1(task1());
        boost::thread my_thread2(task2());
     
        my_thread1.join();
        my_thread2.join();
     
        return exit(EXIT_SUCCESS);
    }
    bien évidement ma création des objets boost::thread est fausse. J'aimerais savoir s'il y a moyen de passer les methodes associées au objets Task pour que les threads executent les taches task1 et task2?

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    410
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 410
    Par défaut
    J'ai trouvé un element de réponse grace au bind
    http://ubuntuforums.org/showthread.php?t=201776
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    boost::thread my_thread(boost::bind( &Task::operator(), &task ) );
    Si vous avez d'autres propositions je suis preneur!


    EDIT:
    il y a encore plus simple visiblement...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my_thread = boost::thread(boost::ref(task));

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    encore plus simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    boost::thread( Task( /*param*/) );
    ?

    vu que c'est un peu prévu à la base pour fonctionner avec des fonctors..

    Et si tu ne veux pas le créer dans le constructeur du thread:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Task t( /*param*/ );
    boost::thread( t );
    sachant que thread utilise une copie de t de toute façon, pour qu'il ne soit pas effacé à la fin du scope.

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Ce n'est pas
    Citation Envoyé par reptils Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // C'est ici que je ne vois pas comment les passer !!!
        boost::thread my_thread1(task1());
        boost::thread my_thread2(task2());
    mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        // C'est ici que je ne vois pas comment les passer !!!
        boost::thread my_thread1(task1);
        boost::thread my_thread2(task2);
    Tout simplement.
    Je te recommande de relire ce qu'est un foncteur...

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    410
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 410
    Par défaut
    ah ouais c'était plus simple en effet...
    Mais cette expression est valable dans le cas où je veut que mon run soit définit dans ma méthode "void Task::operator()()".
    Dans le cas où je souhaite explicitement utiliser une méthode Task::Run() il faut que je passe obligatoirement par le bind?

  6. #6
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Citation Envoyé par reptils Voir le message
    ah ouais c'était plus simple en effet...
    Mais cette expression est valable dans le cas où je veut que mon run soit définit dans ma méthode "void Task::operator()()".
    Dans le cas où je souhaite explicitement utiliser une méthode Task::Run() il faut que je passe obligatoirement par le bind?
    Ca ne me semble pas être tant contraignant que ça

    De toutes manières, fais un choix. Mais mettre une méthode run() dans une classe ça serait lui associée une sémantique de Thread. Or en principe c'est exactement ce que tu confies à boost.thread là. Tu lui dis juste quoi exécuter.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    410
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 410
    Par défaut
    ouaip, bien vu. Je posais la question pour être sur de la réponse et de copremdre.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. boost::thread et OpenGL
    Par Kurisu dans le forum Boost
    Réponses: 12
    Dernier message: 19/09/2006, 13h23
  2. [BOOST]Comment utiliser la lib boost.python
    Par Invité dans le forum Bibliothèques
    Réponses: 6
    Dernier message: 30/01/2006, 11h35
  3. Module Threading, utilisation timer(x,y) .
    Par aladin46 dans le forum Général Python
    Réponses: 3
    Dernier message: 02/01/2005, 18h55
  4. [Astuce][Thread]Utilisation des blocs synchronized
    Par Pill_S dans le forum Concurrence et multi-thread
    Réponses: 14
    Dernier message: 21/07/2004, 14h14

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