boost::thread in Klassen nutzen



  • Hi,

    ich hab das Problem, dass ich boost::thread nicht mit einer nichtstatischen Methode einer Klasse nutzen kann. Weiß jmd wie ich es schaffen könnte?

    Fehlermeldung:

    error: no matching function for call to `boost::thread::thread(<unknown type>)'
    
    note:candidates are boost::thread::thread(boost::detail::thread_move_t<boost::thread>)
    boost::thread::thread(F, typename boost::disable_if<boost::is_convertible<T&, boost::detail::thread_move_t<T> >, boost::thread::dummy*>::type) [with F = int (teeOutputAnalyzer::*)()]
     boost::thread::thread(boost::detail::thread_data_ptr)
     boost::thread::thread(boost::thread&)
    

    Source:

    namespace fs = boost::filesystem;
    
    class teeOutputAnalyzer{
    ...
      public:
        teeOutputAnalyzer(fs::path,fs::path);
        teeOutputAnalyzer(fs::path,fs::path,std::string);
    
        int check();
        void init();
    
        void set_i(int);
    
        bool is_failure();
        std::string get_fmessage();
    };
    ...
    int teeOutputAnalyzer::check(){
      while(true){
        std::cout << "Hello!" << std::endl;
    
        boost::this_thread::sleep(boost::posix_time::seconds(5));
        //Schleife kann über i-var geändert werden.
        if(0!=i)
          break;
      }
    
      return 0;
    }
    
    void teeOutputAnalyzer::init(){
      if(!failure){
        //void (teeOutputAnalyzer::*checkvar)();
        //checkvar = this->check;
    
        boost::thread t(this->check);
      }
    }
    

    Hab alles unwichtige mal gekickt... und eine Denkblockade xD



  • Ich kann nicht auf die Methoden zugreifen... in keinster Weise... ich bräuchte im Prinzip einen Pointer der auf die Methode des Objekts zeigt habe aber keine Ahnung wie ich das realisieren soll.

    Mhh bin aber für alle Lösungen offen.

    Bisher hab ich nur selbst es mit einer Static-Methode geschafft... aber dann könnt ich die ganze Klasse kippen und gleich direkt alles im C style machen.

    Hier nochmal die "kritische" Source.

    int teeOutputAnalyzer::check(){
      while(true){
        std::cout << "Hello!" << std::endl;
    
        boost::this_thread::sleep(boost::posix_time::seconds(5));
        if(0!=i)
          break;
      }
    
      return 0;
    }
    
    void teeOutputAnalyzer::init(){
      if(!failure){
    
        boost::thread t(this->check); //<- da liegt das Problem... :D
      }
    }
    


  • Lässt sich sicher mit boost::bind lösen.



  • Mhh, das ist doch schonmal eine gute Idee... vllt auch mit boost::function... irgendjmd eine idee?



  • Ok ich muss blind gewesen sein. xD

    Man muss natürlich per Bind die Addresse der Function mit dem Object verknüpfen...

    void teeOutputAnalyzer::check(){
      while(true){
        std::cout << "Hello!" << std::endl;
    
        boost::this_thread::sleep(boost::posix_time::seconds(5));
        //Schleife kann über i-var beendet werden.
        if(0!=i)
          break;
      }
    }
    
    void teeOutputAnalyzer::init(){
      if(!failure){
        boost::thread t(boost::bind(&teeOutputAnalyzer::check, this));
      }
    }
    

Log in to reply