Probleme mit boost thread
-
ich versuche einen empfangs und einen sende thread aufzubauen, der sende thread soll kontinuierlich datenanfordern.
// starte empfangsthread boost::thread thrd_recv( &class1.recv ); // starte abrufthread boost::thread thrd_send( &class2.send );Leider meldet mit VS nur folgenden Fehler:
error C2276: '&': Ungültige Operation auf Ausdruck einer gebundenen MemberfunktionHat jemand vieleicht eine Lösung oder Erklärung warum es nicht funktioniert?
Mfg
Piet
-
fehler im obigen code:
// starte empfangsthread boost::thread thrd_recv( &class1.recv ); // starte abrufthread boost::thread thrd_send( &class1.send );
-
Der Konstruktor von boost::thread will eine freie Funktion (void fun(void)). Du übergibst aber eine Memberfunktion.
Ich kenne mich da nicht so riesig aus und würde hier eine Wrapperfunktion um die Memberfunktion schreiben.
Etwa sovoid class1_recv_wrap(class1& c) { c.recv(); } class1 c1; boost::thread thrd_recv( boost::bind(class1_recv_wrap, c1) );
-
Warum nimmst Du da noch einen Wrapper, wenn schon ein Funktor möglich ist?
boost::thread thrd_recv( boost::bind( &class1::recv, &c1 ) );
-
Weil ich das so noch nicht kannte?

Das sieht natürlich besser aus.
-
Hallo, Danke für die Anworten,
leider komme ich soboost::thread thrd_recv( boost::bind( &class1::recv, &c1 ) );nicht zu meinem Ziel da ich ja eine neue instanz meiner class1 bilde, ich hatte class1 in diesem fall schon als instanz gesehen.
Ich habe also:
class1 instanzVonClass1; instanzVonClass1.Attribut1Setzen("..."); instanzVonClass1.Attribut2Setzen("..."); // // Nach dem setzen Versuche ich also einen Thread zu starten der die Instanz // mit den gesetzten werten verwenden kann. // boost::thread thrd_recv( boost::bind( &instanzVonClass1.recv ) ); // Dies löst weiterhin den Fehler: // '&': Ungültige Operation auf Ausdruck einer gebundenen Memberfunktion // aus
-
Piet2007 schrieb:
leider komme ich so
boost::thread thrd_recv( boost::bind( &class1::recv, &c1 ) );nicht zu meinem Ziel da ich ja eine neue instanz meiner class1 bilde, ich hatte class1 in diesem fall schon als instanz gesehen.
Wo wird da eine Instanz erzeugt?
Du kannst statt c1 auch instanzVonClass1 nehmen - Analogieübung sozusagen

BTW:
&class1::recv ist hier die Funktion vom Typ void(class1::*)() und &c1 das Objekt welches der Funktion als this-Objekt übergeben werden soll. Da wird nirgendwo eine Instanz erzeugt.
-
Danke, mich haben die :: aus dem Konzept gebracht, bin noch nicht ganz c++ fest

-
Hallo,
ich habe ein sehr ähnliches Problem, deswegen wollte ich mich gerade hier dran hängen.
Ich habe ein Spiel und hierzu gehört eine Strategie, diese Strategie läßt sich zur Laufzeit durch eine Factory ändern und nun möchte ich diese Strategie noch in einem Thread laufen lassen.
Ich habe eine Abstrakte Klasse Strategy und mehrere Klassen die dann von ihr erben. In der Factory erzeuge ich Instanz strategy auf z.B. Strategy4
Folgender Aufruf
boost::thread thread1( boost::bind( &Strategy::Update, strategy ) );läßt sich kompilieren - UND KLAPPT AUF EINMAL!!!

Na da ich jetzt schon fertiggetippt habe: vielen Dank an alle die in diesem Fred hier so toll erklärt haben wie mein Problem zu lösen war :p
-
Hallo zusammen,
ich habe nochmal ein kleines Problem mit meinen Threads, vieleicht hat ja jemand von euch einen Tipp oder Buchhinweis für mich.
Also ich habe folgendes Problem:
Thread A empfängt mit Funktionen der Klasse A Daten,
- diese Daten sollen nun in einer Datenstruktur der Klasse C gespeichert werden
Thread B soll kontinuierlich die Daten aus Klasse C auslesen und mittels Funktionen der Klasse B die aufbereiteten Daten weiter senden.Ich bräuchte also nun einen festen Speicherbereich auf den ich aus beiden Threads zugreifen kann, hätte dort jemand einen Tipp für mich?
Mfg
Piet
-
Klingt irgendwie nach einem Fall für "bounded queue" für mich.
Denk dir ne synchronisierte std::deque mit einer maximalen Länge und blockierenden "push" und "pull" Methoden.
-
Hallo Hustbear,
das sieht schonmal gut aus, nur leider komme ich im moment nicht auf den sprung wie ich aus beiden klassen dann auf diese que zugreifen kann.
ich denke es liegt an einem fehler in meinem denk ansatz:
#include "klasse_daten_empfangen" #include "klasse_daten_verarbeiten" #inlcude "klasse_daten_que" void main(){ // Erzeuge Objekte: klasse_daten_empfangen instanz_von_klasse_daten_empfangen; klasse_daten_verarbeiten instanz_von_klasse_daten_verarbeiten; // Thread der die Daten empfängt und in die Que schreiben soll boost::thread thrd_recv( boost::bind( &klasse_daten_empfangen::empfangen, &instanz_von_klasse_daten_empfangen ) ); // Thread der die Daten kontinuierlich der Que entnehmen soll boost::thread thrd_work( boost::bind( &klasse_daten_verarbeiten::verarbeiten, &instanz_von_klasse_daten_verarbeiten) );In meiner Klasse klasse_daten_verarbeiten ist die Que ja unbekannt wenn ich diese in der Main function definiere und initialisiere.
Und an der Stelle hänge ich jetzt leider.Mfg
Piet
-
Ich würde das "Daten Schaufeln" auslagern. D.h. du machst dir eine Funktion/Funktor die/der Daten aus Klasse "klasse_daten_empfangen" liest und nach "klasse_daten_que" schreibt, und du machst dir eine Funktion/Funktor die/der Daten aus "klasse_daten_que" liest und nach "klasse_daten_verarbeiten" schreibt.
Wie diese Funktionen/Funktoren ihre Parameter nehmen ist Geschmackssache, du kannst Referenzen übergeben oder boost::shared_ptr oder sogar einfach eine(n) Template Funktion/Funktor basteln die/der 2 Funktoren übergeben bekommt (einen zum Lesen, einen zum Schreiben).
Dann machst du einen "quelle -> queue" Thread (der als Thread-Funktion eben die "quelle -> queue" Funktion bekommt) und einen "queue -> ziel" Thread (der natürlich die "queue -> ziel" Funktion bekommt).
Fertig.
Musst du nur noch eine Abbruchbedingung reinbasteln (damit die Threads nicht ewig laufen) und du bist fertig.Wenn du mir etwas konkreter sagen kannst um was für Daten/Funktionen es da geht kann ich dir vielleicht etwas genauer schreiben bzw. anhand eines kleinen Beispiels zeigen wie das aussehen könnte.
-
Hi, danke schonmal für deine Erklärungen.
Also ich bekomme z.b. auf der einen Seite Zahlenwerte die ich via Tcp Client von einem Tcp Server abrufe, ich sende einen gib daten befehl und bekomme darauf hin werte zurück. Diese Werte sollen nun von einem anderen Thread genommen werden um dann den Zahlen zugeordnete Texte auf einen Hypterterminal weiterzugeben, für diesen stelle ich meinem dritten Thread einen TCP Server bereit worauf das Hyperterminal dann verbindet und mit der klasse_daten_verarbeiten die Daten dann gesendet werden.
Ich hoffe ich habe mein Vorhaben halbwegs verständlich erklärt.
Mfg
Piet