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

Threads & Processus C++ Discussion :

Bind, thread et membre template


Sujet :

Threads & Processus C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 103
    Points : 68
    Points
    68
    Par défaut Bind, thread et membre template
    Bonjour à tous,

    Je cherche à utiliser des threads dans mon appli et je vais me tourner vers boost. Pour passer des paramètres à la fonction de mon thread, j'ai besoin d'utiliser boost::bind (ici). Or, je n'y arrive pas, ne comprenant pas bien le méchanisme. Pourriez vous m'aider ?

    Fonction du thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Profile
    {
      /// ...
      template <class T> bool ComputeRadiometries( boost::shared_ptr< TTImage <T> > image , const eInterpolatorType type_interpolator=BICUBIC )
      {
         /// ...
      }
    };
    Je voudrais faire des threads comme ca (voir le lien) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    boost::shared_ptr<Profile> p2 ( new Profile(origine+(double)i*width_sur_nb_fois_wdir,rect->GetHeightDirection(),MPPParameters_.ProfilesNbPoints_,MPPParameters_.ProfilesDistancePoints_ ) );
    boost::shared_ptr<Profile> p3 ( new Profile(origine+(double)(-i)*width_sur_nb_fois_wdir,rect->GetHeightDirection(),MPPParameters_.ProfilesNbPoints_,MPPParameters_.ProfilesDistancePoints_ ) );
    boost::thread thrd1(boost::bind(????));
    boost::thread thrd2(boost::bind(????));
    thrd1.join();
    thrd2.join();
    Le problème, c'est donc la construction du thread. Je ne vois pas du tout comment y arriver.

    J'ai essayé ça, mais ça ne compile pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    boost::function<bool (Profile*, boost::shared_ptr< TTImage <unsigned char> >, eInterpolatorType)> f;
    f = &Profile::template ComputeRadiometries<unsigned char>; // compile pas !
    Merci de vos pistes

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

    Essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boost::thread thrd1( boost::bind( &Profile::ComputeRadiometries< unsigned char >, p2, image ) );
    Ca passe ?

    MAT.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 103
    Points : 68
    Points
    68
    Par défaut
    Hello,

    Non, ça ne passe pas. Tout un tas d'erreurs, j'ai l'impression qu'il y a un problème avec les typelist (je mets pas tout, seulement les premières) :

    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
    \MATIS\Codes\MATIS_DEV\src\structures\rjmcmc_graph_struct.cpp(345) : error C2780: 'boost::_bi::bind_t<R,boost::_mfi::dm<R,T>,_bi::list_av_1<A1>::type> boost::bind(R T::* ,A1)' : 2 arguments attendus - 4 fournis
            E:\librairies\boost_1.33.1_build\include\boost\bind.hpp(1616) : voir la déclaration de 'boost::bind'
            E:\librairies\CGAL-3.3.1\include\CGAL\Root_of_traits.h(95) : voir la référence à l'instanciation du modèle de classe 'CGAL::CGALi::Root_of_traits_helper<FT,CGAL::Field_tag>' en cours de compilation
    \MATIS\Codes\MATIS_DEV\src\structures\rjmcmc_graph_struct.cpp(345) : error C2780: 'boost::_bi::bind_t<R,boost::_mfi::cmf8<R,T,B1,B2,B3,B4,B5,B6,B7,B8>,_bi::list_av_9<A1,A2,A3,A4,A5,A6,A7,A8,A9>::type> boost::bind(R (__thiscall T::* )(B1,B2,B3,B4,B5,B6,B7,B8) const,A1,A2,A3,A4,A5,A6,A7,A8,A9)' : 10 arguments attendus - 4 fournis
            E:\librairies\boost_1.33.1_build\include\boost\bind\bind_mf_cc.hpp(222) : voir la déclaration de 'boost::bind'
    \MATIS\Codes\MATIS_DEV\src\structures\rjmcmc_graph_struct.cpp(345) : error C2780: 'boost::_bi::bind_t<R,boost::_mfi::mf8<R,T,B1,B2,B3,B4,B5,B6,B7,B8>,_bi::list_av_9<A1,A2,A3,A4,A5,A6,A7,A8,A9>::type> boost::bind(R (__thiscall T::* )(B1,B2,B3,B4,B5,B6,B7,B8),A1,A2,A3,A4,A5,A6,A7,A8,A9)' : 10 arguments attendus - 4 fournis
            E:\librairies\boost_1.33.1_build\include\boost\bind\bind_mf_cc.hpp(211) : voir la déclaration de 'boost::bind'
    \MATIS\Codes\MATIS_DEV\src\structures\rjmcmc_graph_struct.cpp(345) : error C2780: 'boost::_bi::bind_t<R,boost::_mfi::cmf7<R,T,B1,B2,B3,B4,B5,B6,B7>,_bi::list_av_8<A1,A2,A3,A4,A5,A6,A7,A8>::type> boost::bind(R (__thiscall T::* )(B1,B2,B3,B4,B5,B6,B7) const,A1,A2,A3,A4,A5,A6,A7,A8)' : 9 arguments attendus - 4 fournis
            E:\librairies\boost_1.33.1_build\include\boost\bind\bind_mf_cc.hpp(198) : voir la déclaration de 'boost::bind'
    \MATIS\Codes\MATIS_DEV\src\structures\rjmcmc_graph_struct.cpp(345) : error C2780: 'boost::_bi::bind_t<R,boost::_mfi::mf7<R,T,B1,B2,B3,B4,B5,B6,B7>,_bi::list_av_8<A1,A2,A3,A4,A5,A6,A7,A8>::type> boost::bind(R (__thiscall T::* )(B1,B2,B3,B4,B5,B6,B7),A1,A2,A3,A4,A5,A6,A7,A8)' : 9 arguments attendus - 4 fournis
            E:\librairies\boost_1.33.1_build\include\boost\bind\bind_mf_cc.hpp(187) : voir la déclaration de 'boost::bind'
    \MATIS\Codes\MATIS_DEV\src\structures\rjmcmc_graph_struct.cpp(345) : error C2780: 'boost::_bi::bind_t<R,boost::_mfi::cmf6<R,T,B1,B2,B3,B4,B5,B6>,_bi::list_av_7<A1,A2,A3,A4,A5,A6,A7>::type> boost::bind(R (__thiscall T::* )(B1,B2,B3,B4,B5,B6) const,A1,A2,A3,A4,A5,A6,A7)' : 8 arguments attendus - 4 fournis
            E:\librairies\boost_1.33.1_build\include\boost\bind\bind_mf_cc.hpp(174) : voir la déclaration de 'boost::bind'
    \MATIS\Codes\MATIS_DEV\src\structures\rjmcmc_graph_struct.cpp(345) : error C2780: 'boost::_bi::bind_t<R,boost::_mfi::mf6<R,T,B1,B2,B3,B4,B5,B6>,_bi::list_av_7<A1,A2,A3,A4,A5,A6,A7>::type> boost::bind(R (__thiscall T::* )(B1,B2,B3,B4,B5,B6),A1,A2,A3,A4,A5,A6,A7)' : 8 arguments attendus - 4 fournis
            E:\librairies\boost_1.33.1_build\include\boost\bind\bind_mf_cc.hpp(163) : voir la déclaration de 'boost::bind'
    \MATIS\Codes\MATIS_DEV\src\structures\rjmcmc_graph_struct.cpp(345) : error C2780: 'boost::_bi::bind_t<R,boost::_mfi::cmf5<R,T,B1,B2,B3,B4,B5>,_bi::list_av_6<A1,A2,A3,A4,A5,A6>::type> boost::bind(R (__thiscall T::* )(B1,B2,B3,B4,B5) const,A1,A2,A3,A4,A5,A6)' : 7 arguments attendus - 4 fournis
            E:\librairies\boost_1.33.1_build\include\boost\bind\bind_mf_cc.hpp(150) : voir la déclaration de 'boost::bind'
    \MATIS\Codes\MATIS_DEV\src\structures\rjmcmc_graph_struct.cpp(345) : error C2780: 'boost::_bi::bind_t<R,boost::_mfi::mf5<R,T,B1,B2,B3,B4,B5>,_bi::list_av_6<A1,A2,A3,A4,A5,A6>::type> boost::bind(R (__thiscall T::* )(B1,B2,B3,B4,B5),A1,A2,A3,A4,A5,A6)' : 7 arguments attendus - 4 fournis
            E:\librairies\boost_1.33.1_build\include\boost\bind\bind_mf_cc.hpp(139) : voir la déclaration de 'boost::bind'
    \MATIS\Codes\MATIS_DEV\src\structures\rjmcmc_graph_struct.cpp(345) : error C2780: 'boost::_bi::bind_t<R,boost::_mfi::cmf4<R,T,B1,B2,B3,B4>,_bi::list_av_5<A1,A2,A3,A4,A5>::type> boost::bind(R (__thiscall T::* )(B1,B2,B3,B4) const,A1,A2,A3,A4,A5)' : 6 arguments attendus - 4 fournis
            E:\librairies\boost_1.33.1_build\include\boost\bind\bind_mf_cc.hpp(126) : voir la déclaration de 'boost::bind'
    \MATIS\Codes\MATIS_DEV\src\structures\rjmcmc_graph_struct.cpp(345) : error C2780: 'boost::_bi::bind_t<R,boost::_mfi::mf4<R,T,B1,B2,B3,B4>,_bi::list_av_5<A1,A2,A3,A4,A5>::type> boost::bind(R (__thiscall T::* )(B1,B2,B3,B4),A1,A2,A3,A4,A5)' : 6 arguments attendus - 4 fournis
            E:\librairies\boost_1.33.1_build\include\boost\bind\bind_mf_cc.hpp(115) : voir la déclaration de 'boost::bind'
    \MATIS\Codes\MATIS_DEV\src\structures\rjmcmc_graph_struct.cpp(345) : error C2780: 'boost::_bi::bind_t<R,boost::_mfi::cmf3<R,T,B1,B2,B3>,_bi::list_av_4<A1,A2,A3,A4>::type> boost::bind(R (__thiscall T::* )(B1,B2,B3) const,A1,A2,A3,A4)' : 5 arguments attendus - 4 fournis
            E:\librairies\boost_1.33.1_build\include\boost\bind\bind_mf_cc.hpp(102) : voir la déclaration de 'boost::bind'
    \MATIS\Codes\MATIS_DEV\src\structures\rjmcmc_graph_struct.cpp(345) : error C2780: 'boost::_bi::bind_t<R,boost::_mfi::mf3<R,T,B1,B2,B3>,_bi::list_av_4<A1,A2,A3,A4>::type> boost::bind(R (__thiscall T::* )(B1,B2,B3),A1,A2,A3,A4)' : 5 arguments attendus - 4 fournis
            E:\librairies\boost_1.33.1_build\include\boost\bind\bind_mf_cc.hpp(91) : voir la déclaration de 'boost::bind'
    Le seul truc que j'ai réussi à faire, c'est comme ça :

    // Déclarer une fonction hors de toute classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void lance_thread( boost::shared_ptr<Profile> p , boost::shared_ptr< TTImage <unsigned char> > image , eInterpolatorType typeinterp)
    {
    	p->ComputeRadiometries(image,typeinterp);
    }
    Et lancer les threads comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #if defined USE_THREADS
    			boost::thread t1( boost::bind(&lance_thread,p2,image_,BICUBIC) );
    			boost::thread t2( boost::bind(&lance_thread,p3,image_,BICUBIC) );
    			t1.join();
    			t2.join();
    #else
    Cela dit, c'est tout pourri et en plus je prends un facteur 10 en temps de calcul ...

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Citation Envoyé par olivier1978 Voir le message
    je prends un facteur 10 en temps de calcul ...
    Ca n'est pas a cause du boost::bind puisque l'appel derriere ne sera fait qu'une fois de toute facon.

    Ca n'a pas vraiment de rapport mais je vois que tu lances les 2 traitements sur la meme image, tu n'y fais que des acces en lecture ?

    Sinon pour le boost::bind essaye en rajoutant le parametre qui est par defaut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boost::thread thrd1( boost::bind( &Profile::ComputeRadiometries< unsigned char >, p2, image, BICUBIC ) );
    MAT.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 103
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par Mat007 Voir le message
    Ca n'est pas a cause du boost::bind puisque l'appel derriere ne sera fait qu'une fois de toute facon.
    Oui, on est d'accord, je ne vois pas d'où ça vient
    Citation Envoyé par Mat007 Voir le message
    Ca n'a pas vraiment de rapport mais je vois que tu lances les 2 traitements sur la meme image, tu n'y fais que des acces en lecture ?
    Oui, pas de problème d'accès concurrent
    Citation Envoyé par Mat007 Voir le message
    Sinon pour le boost::bind essaye en rajoutant le parametre qui est par defaut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boost::thread thrd1( boost::bind( &Profile::ComputeRadiometries< unsigned char >, p2, image, BICUBIC ) );
    Ben en fait, c'est ce que j'avais fait.

    Même quand tu suis rigoureusement ce qui est indiqué dans la doc, ça ne marche pas (voir ici) ... Boost, très bien, mais si mal documenté ...

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Le lien que tu donnes est pour Boost.Function, il faut regarder Boost.Bind.

    Sinon le code suivant compile avec vc80 :

    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
    #include <boost/shared_ptr.hpp>
    #include <boost/bind.hpp>
     
    namespace
    {
        template< typename T > class A {};
     
        class B {};
     
        enum E
        {
            eVal
        };
     
        class C
        {
        public:
            template< typename T > void F( boost::shared_ptr< T >, boost::shared_ptr< A< unsigned char > >, E = eVal ) {}
        };
    }
     
    int main()
    {
        boost::shared_ptr< A< unsigned char > > a( new A< unsigned char > );
        boost::shared_ptr< B > b( new B );
        boost::shared_ptr< C > c( new C );
        boost::bind( &C::F< B >, c, b, a, eVal );
        return 0;
    }
    Quel est ton compilateur ?

    MAT.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 103
    Points : 68
    Points
    68
    Par défaut
    C'est intéressant. Il ne compile pas sous VC 7.1. Les mêmes erreurs de compilation que celles que j'ai postées précédemment.

  8. #8
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Ah c'est sur que vc71 n'est pas tres fort concernant la gestion des templates, je ne pense pas que tu puisses arriver a mieux avec...

    MAT.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 103
    Points : 68
    Points
    68
    Par défaut
    Oui, enfin boost.bind existait quand même avant la sortie de VC 2005, non ? Il doit bien y a voir une solution

Discussions similaires

  1. Réponses: 3
    Dernier message: 09/04/2009, 11h30
  2. [C++] fonction membre template
    Par Luc Hermitte dans le forum BOUML
    Réponses: 3
    Dernier message: 03/02/2009, 23h01
  3. Problème de spécialisation de fonction membres template
    Par ludovic.barrillie dans le forum Langage
    Réponses: 3
    Dernier message: 17/04/2007, 08h44
  4. Pointeur de fonction membre template
    Par bolhrak dans le forum Langage
    Réponses: 6
    Dernier message: 12/12/2006, 14h47
  5. Réponses: 5
    Dernier message: 29/12/2005, 21h27

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