template funktion als thread aufrufen (boost::thread)



  • Hallo,
    ich wieder einmal eine Frage zum Thema boost::thread. Ich rufe eine Pythonmethode von einer C++-Klasse aus auf und würde diesen Aufruf gerne als Thread laufen lassen. Normal würde ich es wie folgt machen.

    boost::thread thrd(boost::bind(&call_method<void>, this->self, "performEvent", str("jo !!!!")));
    

    Leider sagt mir der Compiler, dass er den Rückgabewert der Funktion call_method nicht kennt.

    error: no matching function for call to `bind(<unknown type>, PyObject*&, const char[13], boost::python::str)'
    

    Kann mir jemand weiter helfen? danke schon mal im voraus.

    gruß
    tyr377



  • wie ist denn call_method definiert?



  • ja, in boost::python. Der Aufruf an sich funktioniert aus und sieht wie folgt aus.

    call_method<void>(this->self, "performEvent", str("jo !!!!"));
    


  • oh, ich habe wohl schon Tomaten auf den Augen. 🙄 Aber ich denke du kannst die Info entnehmen. call_method ist ne boost::python-funktion.
    gruß
    tyr377



  • Ja, dann kann der Compiler das auch nicht.
    Da hilft i.A. casten. Etwa so was

    boost::bind( (void (*)( PyObject*, const char*, boost::python::str ))&call_method<void>, this->self, "performEvent", str("jo !!!!"))
    

    ich unterstelle mal, der Returntyp ist void; bitte prüfe noch mal die anderen Parameter. Aber dann sollte es gehen.

    Gruß
    Werner



  • Rückgabewert ist void, das hast du völlig recht. Aber leider macht der g++ es immer noch nicht.

    error: no matches converting function `call_method' to type `void (*)(struct PyObject*, const char*, class boost::python::str)'
    


  • Dann gib mal alle Template-Parameter an. Also

    boost::bind( (void (*)( PyObject*, const char*, const boost::python::str& ))&call_method<void, boost::phthon::str >
        , this->self, "performEvent", str("jo !!!!"))
    
    // in der Hilfe steht:
    template <class R, class A1, class A2, ... class An>
    R call_method(PyObject* self, char const* method, A1 const&, A2 const&, ... An const&)
    

    .. eigentlich solltest Du den cast dann auch weglassen können 😕 .
    Das Problem ist hier, dass man nicht genau weiß wie dieses method_call<> definiert ist.

    Gruß
    Werner



  • Tja, selbe Antwort vom g++ wie vorher auch. Habe dann auch mal den cast weg genommen und dann sagt er wieder 'unknown type'. 😞 Einfach kann halt jeder. 😉



  • Als völlig unwissender (sowohl was Python als auch boost::python angeht) in den Raum geworfen:
    Evtl. &boost::python::call_method?



  • LordJaxom schrieb:

    Als völlig unwissender (sowohl was Python als auch boost::python angeht) in den Raum geworfen:
    Evtl. &boost::python::call_method?

    Das war auch eine meiner ersten Vermutungen aber leider nein. Es macht keinen Unterschied.


Anmelden zum Antworten