"kleines" Problem mit boost::thread



  • Hier erstmal meine Timer Klasse

    #include <boost/thread.hpp>
    
    class Timer{ 
    
    public:
    
        //for C++ member functions
        template<class C>
        Timer(void (C:: *functionPointer)() , C* _obj, int _s) : stoprequested (false) {
    
            boost::thread thread( &Timer::threadFunction_obj, this, functionPointer , _s );
        };
    
        //for C and C++ static functions
        Timer(void (*functionPointer)()  , int _s) : stoprequested (false) {
            boost::thread thread(&Timer::threadFunction, this, functionPointer , _s);
        };
    
        void stop(){
            stoprequested = true;
        };
    
    private:
    
        ~Timer(){ // private, da zerstörung nix bewirken würde (Thread läuft weiter) benutze statdessen timer->stop()
    
        };
    
        bool stoprequested;
    
        template<class C>
        void threadFunction_obj(void (C::*_func)(), C* __obj, int s){
    
            while(!stoprequested){
                C _obj;
    
                (_obj.*_func)();
    
                sleep(s);
            }
    
            delete this;
        };
    
        //for C and C++ static functions
        void threadFunction( void (*functionPointer)(), int s){
    
            while(!stoprequested){
    
                functionPointer();
    
                sleep(s);
            }
    
            delete this;
        };
    };
    

    Sie soll, wie vlt einige schon bemerken, einen Thread verwalten in dem eine übergebende Funktion in regelmäßigen Abständen aufgerufen wird. Der Teil für die normalen C und die statischen C++ Funktionen funktioniert auch wunderbar. Leider nicht für die Memberfunktionen. Ich weiß nur, dass die boost::thread Bibliothek den Verweis auf die template Funktion nicht annehmen möchte. Den Umweg, die Threads in den einzelnen Klassen zu starten, finde ich unschön, da ich somit nicht so leicht auf alle Threads zugreifen kann.
    Der direkte Aufruf von Timer::threadFunction_obj() funktioniert auch wunderbar mit den in template<> Timer() übergebenden Argumente.
    Also hängts nur an der Threaderstellung.

    Falls es interessant ist, ich verwende die Version 1.43 der Boost library.

    Und sry, dass ich gleich beim ersten Post mit so einen Problem ankomme 😃 Ich bin dennoch für jede Hilfe sehr dankbar (auch weil mich das schon Tage beschäftigt 😞 )

    Also schon einmal vielen Dank im voraus

    karolherbst



  • template<class C>
    void threadFunction_obj(void (C::*_func)(), int s){
    
        while(!stoprequested){
    
            C _obj;
            (_obj.*_func)();
    
            sleep(s);
        }
    
        delete this;
    };
    

    so lautet natürlich die Funktion, das Objekt braucht nicht übergeben zu werden (habe schon fast zu viel probiert)


Anmelden zum Antworten