Methode an Thread übergeben



  • Hallo,

    ich habe eine Klasse recorder mit den Methoden stream_control () und record (). Nun erzeuge ich zwei Objekte dieser Klasse (stream1 und stream2). Ich möchte nun, dass die Methode stream_control () (in der sich eine Endlosschleife befindet) jedes Objektes parallel ausgeführt wird.
    Hierfür möchte ich die Boost-Thread Library verwenden. Allerdings weiß ich nicht, wie ich eine Methode an den Thread-Konstruktor übergeben soll.

    boost::thread thrd1 (stream1.stream_control ())
    thrd1.join ();
    // das selbe mit stream2
    

    funktioniert leider nicht.

    Kann mir hier jemand weiterhelfen oder einen besseren Designansatz nennen, der es ermöglicht mehrere Objekte und deren Methode parallel abarbeiten zu lassen?

    Danke



  • boost::thread thrd1(boost::bind(&stream_klasse::stream_control, &stream1));
    thrd1.join ();
    


  • Vielen Dank für die Lösung.

    Allerdings ist mir nicht ganz klar, was die boost::bind Funktion so genau macht. Kann mir vielleicht jemand kurz erklären, wie diese Funktion arbeitet, bzw. warum ich nicht einfach boost::thread thrd1 (objekt.methode ()) verwenden kann?



  • Ich würde mal sagen, boost::thread erwartet einen Funktor oder eine normale Funktion als Thread-Funktion und keine Methode - und boost::bind baut sich aus einem Methodenzeiger und einem Objekt einen Funktor zusammen, den du dann weiterverwenden kannst.



  • Weil "objekt.methode()" ein Aufruf von methode mit this == &objekt ist, und der Rückgabewert dieses Aufrufs an den Konstruktor von boost::thread übergeben wird. Der möchte aber eigentlich lieber einen irgendwie gearteten Funktor haben, und keinen beliebigen Wert.

    Die boost::bind-Funktion bindet (wie der Name andeutet) Parameter an Funktoren, um andere Funktoren zu erzeugen. Im Beispiel wird an den ersten Parameter einer Methode, die einen Parameter vom Typ stream_klasse* erwartet, ein Zeiger auf stream1 gebunden. So wird eine Methode erzeugt, die keine Parameter erwartet.



  • LordJaxom schrieb:

    Die boost::bind-Funktion bindet (wie der Name andeutet) Parameter an Funktoren, um andere Funktoren zu erzeugen. Im Beispiel wird an den ersten Parameter einer Methode, die einen Parameter vom Typ stream_klasse* erwartet, ein Zeiger auf stream1 gebunden. So wird eine Methode erzeugt, die keine Parameter erwartet.

    Danke für die Antwort. Allerdings ist mir das noch nicht so richtig klar 😕 . Kann vielleicht jemand ein kurzes Quellcodebeispiel posten oder mir einen Link nennen, wo das etwas genauer erklärt wird?

    Danke



  • Google scheint nicht dein Freund zu sein.
    Eine Suche nach "boost bind" findet als 1. Treffer die passende Doku:

    http://www.boost.org/libs/bind/bind.html



  • Dort steht aber nur, wie man boost::bind verwendet! Ich möchte aber wissen, wie sich das theoretisch aufbaut, also eine etwas genauere Erklärung dessen, was ich von LordJaxom zitiert habe.



  • Dann guck dir den Code an.
    Davon abgesehen ist es auch logisch.
    Es wird eine Instanz einer Klasse zurückgeliefert die die gebundenen Parameter speichert.
    Die dafür nötigen Klassen werden natürlich über einen Haufen Templates erzeugt.


Log in to reply