suche hilfe mit boost_thread



  • hi leute!

    bin gerade dabei mich in threads einzuarbeiten. benutze dafür boost_thread. konnte es auch installieren und erste erfolge verbuchen.

    folgender code funktioniert:

    #include <iostream>
    #include <boost/thread/thread.hpp>
    
    using namespace std;
    
    void foo()
    {
    	for(int i=0; i<10000; i++)
    		cout << "huhu: " << i << endl;
    }
    
    void bar()
    {
    	for(int i=0; i<10000; i++)
    		cout << "lala: " << i << endl;
    }
    
    int main()
    {
    	boost::thread t1(&foo); // Thread-Objekt t1 erstellen und foo() starten.
    	bar(); // t1 läuft gleichzeitig weiter, während bar() aufgerufen wird!
    }
    

    und jetzt zu meinem problem! wenn ich die funktionen in einer klasse schreibe und diese dann in der main im thread starten will, dann bekomme ich immer eine fehlermeldung. mein code sieht wie folgt aus:

    #include <iostream>
    #include <boost/thread/thread.hpp>
    
    using namespace std;
    
    class test
    {
    public:
            test();
            ~test();
            void foo();
            void bar();
    };
    
    test::test()
    {
    }
    
    test::~test()
    {
    }
    
    void test::foo();
    {
    	for(int i=0; i<10000; i++)
    		cout << "huhu: " << i << endl;
    }
    
    void test::bar()
    {
    	for(int i=0; i<10000; i++)
    		cout << "lala: " << i << endl;
    }
    
    int main()
    {
            test t;
    	boost::thread t1(test::foo); 
    	t.bar();
    }
    

    wäre über hilfe sehr erfreut!!!!



  • Und wir dürfen jetzt raten, welcher Fehler da kommt - richtig?



  • sorry für doppel post. aber ich vergass den fehler zu posten.

    also folgender fehler erscheint dann:

    /usr/include/boost/function/function_template.hpp instantiated from »boost::function0<R, Allocator>::function0(Functor, typename boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, int>::type) [with Functor = void (test::*)(), R = void, Allocator = std::allocatorboost::function_base

    und

    /usr/include/boost/function/function_template.hpp Fehler: keine passende Funktion für Aufruf von »boost::function0<void, std::allocatorboost::function\_base >::assign_to(void (test::*&)(), boost::detail::function::member_ptr_tag)«



  • Naja, dein Code ist ja auch total falsch. Hast einfach ins blaue geraten, wie man es machen könnte. SO geht das natürlich schief. Entweder stellst du einen Funktions-Operator in deiner Klasse bereit und übergibts einfach das Objekt t oder machst sowas:

    boost::thread t1(boost::bind(std::mem_fun(&test::foo), t)
    


  • Also ich rate mal...
    Die Adresse einer nicht statischen methode kann man nicht einfach so mit Klasse::methode bekommen oder?
    Versuche mal ein '&' davor. Hab leider kein boost hier.



  • also das mit dem geraten ist schon richtig. ich habe aber nirgens nen beispiel oder was mir helfen könnte gefunden. ich werde mal schaun ob ich es mit deiner sache da hinbekomme!

    bin aber wie gesagt anfänger in sachen boost_thread. also bitte mich nicht gleich zerfleischen.



  • bei funktionen bzw. funktionszeigern ist es afaik egal. mann kann schreiben "&funktion" oder einfach "funktion" und verwenden kann man das ebenfalls ohne den dereferenzierungsoperator "*pFunktion()" oder "pFunktion()" bringen also ebenfalls dasselbe ergebnis 😉



  • habe das mit

    [cpp]

    boost::thread t1(boost::bind(std::mem_fun(&test::foo), t)
    

    mal probiert hat aber so nicht funktioniert. schmeisst mir da eingige sehr lange fehler aus.

    habe es jetzt so gelöst das ich mir ne statische funktion geschrieben habe. da klappt das dann auch mit meinem aufruf. ist mit sicherheit nicht der richtige weg aber so klappt es und ich kann erstmal weiter probieren. wäre natürlich über jede weitere lösung dankbar. weil ich will ja lernen!!! achso das mit dem funktionsoperator habe ich nicht probiert, weil ich erlich sagen muss, das ich nicht weiß wie das funzt. bin halt noch ziemlicher neuling und lebe nach dem motto: learn by doing



  • Das std::memfun brauchst du nicht. Boost.Bind funktioniert auch ohne!
    Mit

    boost::thread t1(boost::bind (&test::foo, t));
    

    kompilierts anstandslos. Ob es dann läuft (was es hier tut (OSX, gcc4)) ist eine andere Frage. Ich bezweifle, dass man aus zwei Threads gleichzeitig in einen Stream schreiben darf ohne diesen ordentlich zu sperren (edit: das, was hier stand war µll).



  • ja es läuft
    boost::bind ist ziemlich cool

    man kann sogar sowas machen

    bool nein() { return false; }
    
    template <class F> void test(F f) {
        assert(f());
    }
    
    int main () {
        test(!boost::bind(nein));
    }
    

    Sind auch noch andere Operatoren überladen... damit gehen dann so sachen wie

    struct foo {
    	int m_id;
    	foo(int id) : m_id(id) {}
    	int get_id() { return m_id; }
    };
    
    int main()
    {
    	std::vector<foo> bar;
    	bar.push_back(foo(100));
    	bar.push_back(foo(101));
    
    	std::vector<foo>::iterator it = std::find_if(bar.begin(), bar.end(), boost::bind(&foo::get_id, _1) == 100);
    	assert(it == bar.begin());
    	it = std::find_if(bar.begin(), bar.end(), boost::bind(&foo::get_id, _1) > 102);
    	assert(it == bar.end());
    	//...
    }
    

Anmelden zum Antworten