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 einevoid 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 wirdDanke, 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