Problem mit boost::thread in Klassen



  • Guten Abend allerseits,

    habe oben genanntes Problem und hoffe hier etwas starthilfe zu bekommen.

    Folgender Beispielcode einer Webseite funktioniert einwandfrei zu kompilieren:

    #include <iostream>  
     #include <boost/thread.hpp>  
     #include <boost/date_time.hpp>  
    
     void workerFunc()  
     {  
         boost::posix_time::seconds workTime(3);  
    
         std::cout << "Worker: running" << std::endl;  
    
         for ( int i = 0 ; i < 20 ; i++ )
         {
             std::cout << "Number : " << i << std::endl;
         }
         boost::this_thread::sleep(workTime);  
    
         std::cout << "Worker: finished" << std::endl;  
     }  
    
     int main(int argc, char* argv[])  
     {  
         std::cout << "main: startup" << std::endl;  
    
         boost::thread workerThread(workerFunc);  
    
         std::cout << "main: waiting for thread" << std::endl;  
    
         workerThread.join();  
    
         std::cout << "main: done" << std::endl;  
    
         return 0;  
     }
    

    Wenn ich das ganze jedoch in eine Klasse packe, bekomm ich eine Fehlermeldung.
    Hier mal der Codeausschnitt:

    void Server::worker()
    {
        std::cout << "Worker : start" << std::endl;
        for ( int i = 0 ; i < 20 ; i++ )
        {
            std::cout << "Number : " << i << std::endl;
        }
        std::cout << "Worker : end" << std::endl;
    }
    
    void Server::start()
    {
        std::cout << "Main : Starting thread.." << std::endl;
        threading = new boost::thread(worker);
    }
    

    und dann kommt folgende Fehlermeldung:

    error: invalid static_cast from type ‘<unresolved overloaded function type>’ to type ‘void*’
    

    Wieso funktioniert es, wenn es nicht in einer klasse ist?

    Besten Dank.



  • Du suchst boost::bind.



  • Mr. Thread schrieb:

    Wieso funktioniert es, wenn es nicht in einer klasse ist?

    wie drakon schon sagt: du sucht boost::bind

    ungetestet:

    boost::thread(boost::bind(&MyServer::worker,this));
    

    Zu der Frage, warum es nicht läuft:
    Im ersten Fall hast du eine (einfache) Funktion, im zweiten eine Member-Funktion.

    boost::bind ist quasi ein Objekt mit einem operator()(), // dieser wird bei starten des Threads aufgerufen
    und wrapped inden Funktionsaufruf quasi in einen Funktionsaufruf auf dein Objekt,
    wobei die angegebene Funktion aufgerufen wird



  • also ich hatte auch mal so ein ähnliches Problem, aber als ich nachgesehen habe lag es nur an der alten Version...

    Funktionszeiger gibt's im Thread-Construktor erst seit Version >1.35.
    Müssten dann nicht alle Funktionszeiger als Callable durchgehen?



  • </Exit> schrieb:

    also ich hatte auch mal so ein ähnliches Problem, aber als ich nachgesehen habe lag es nur an der alten Version...

    Funktionszeiger gibt's im Thread-Construktor erst seit Version >1.35.
    Müssten dann nicht alle Funktionszeiger als Callable durchgehen?

    Nur eine Vermutung:
    Wenn dein Objekt, auf das dein Zeiger zeigt eine

    void operator()();
    

    Funktion hat evtl.?

    Welche Funktion soll er denn Aufrufen?
    Ich vermute mal, es ist die einzige, die in Frage kommt...

    EDIT: Dann müßtest du als Parameter aber das Objekt übergeben
    EDIT2: Ich meine natürlich: Auf welchem Objekt soll er die Funktion ausführen.



  • CSpille schrieb:

    Mr. Thread schrieb:

    Wieso funktioniert es, wenn es nicht in einer klasse ist?

    wie drakon schon sagt: du sucht boost::bind

    ungetestet:

    boost::thread(boost::bind(&MyServer::worker,this));
    

    Zu der Frage, warum es nicht läuft:
    Im ersten Fall hast du eine (einfache) Funktion, im zweiten eine Member-Funktion.

    boost::bind ist quasi ein Objekt mit einem operator()(), // dieser wird bei starten des Threads aufgerufen
    und wrapped inden Funktionsaufruf quasi in einen Funktionsaufruf auf dein Objekt,
    wobei die angegebene Funktion aufgerufen wird

    Danke, daran hats gelegtn 🙂
    Das Objekt hat keine Funktion mit nem operator()().

    Besten Dank.



  • Ich meine natürlich: Auf welchem Objekt soll er die Funktion ausführen.

    Das stimmt allerdings... Man müsste das Objekt angeben.
    Ok, dann geht's doch nicht. Thx 😉


Anmelden zum Antworten