Boost Fragen



  • Hallo,

    ich beschäftige mich jetzt mit Boost, da es ja inzwischen schon einen recht großen Bekanntheitsgrad erlangt hat. Ich habe aber einige Probleme. Zum Beispiel scheint sowas nicht möglich zu sein:

    void bla()
    {
      while (true)
      {
        // ...
      }
    }
    
    int main()
    {
      boost:thread...
      thread.join(&bla);
    
      while (true)
      {
        // ...
      }
    }
    

    Ich würde gerne in meiner main einen Thread mit einer Endlosschleife starten und anschließend in der main weitermachen. Ist das nicht möglich?

    Ein anderes Problem: Wie kann ich mit boost::asio mehrere Verbindungen aufnehmen? Es ist ja schön, dass dort ein daytime Server und allen möglichen Zeugs beschrieben wird, es aber leider keinen Hinweise gibt, wie ich einen Server programmieren kann, der mehrere Verbindungen aufnehmen kann. Ich hatte erst die Idee es so zu versuchen: boost::socket blub(io) [MAX_CLIENTS];

    Aber das scheint der falsche Weg zu sein...

    Würde mich über Hilfe sehr freuen.

    Viele Grüße,
    BoostNeuling



  • BoostNeuling schrieb:

    Ich würde gerne in meiner main einen Thread mit einer Endlosschleife starten und anschließend in der main weitermachen. Ist das nicht möglich?

    Natürlich. du solltest dich erst mal allgemein mit Threads beschäftigen und verstehen, was das alles ist, vor du jetzt mit boost solange rumprobierst bis es geht.



  • Natürlich ist das möglich, hab vorher dein "nicht" überlesen.



  • Lösungskugel schrieb:

    Natürlich ist das möglich, hab vorher dein "nicht" überlesen.

    Wenn ich join() aufrufe blockiert das Programm => In der main() gehts nicht weiter bis der Thread zu Ende ist, da es sich aber um eine Endlosschleife handelt wird das wohl eine längere Angelegenheit 😃



  • So sollte das gehen:

    #include <boost/thread.hpp>
    
    void bla()
    {
        for(;;)
        {
            // ...  irgendwie sollte irgendwann diese Schleife abbrechen
        }
    }
    
    int main()
    {
        boost::thread thread_( &bla );  // hier startet der Thread
        for(;;)
        {
            // ... das läuft 'parallel'
        }
        thread_.join(); // wartet auf das Ende von 'thread_'
        return 0;
    }
    

    Gruß
    Werner



  • Werner Salomon schrieb:

    So sollte das gehen:

    #include <boost/thread.hpp>
    
    void bla()
    {
        for(;;)
        {
            // ...  irgendwie sollte irgendwann diese Schleife abbrechen
        }
    }
    
    int main()
    {
        boost::thread thread_( &bla );  // hier startet der Thread
        for(;;)
        {
            // ... das läuft 'parallel'
        }
        thread_.join(); // wartet auf das Ende von 'thread_'
        return 0;
    }
    

    Gruß
    Werner

    Vielen Dank! So klappt es perfekt 🙂 Jetzt bleibt nur noch die Frage zu asio offen 🙂

    Viele Grüße,
    BoostNeuling


  • Administrator

    BoostNeuling schrieb:

    Ein anderes Problem: Wie kann ich mit boost::asio mehrere Verbindungen aufnehmen? Es ist ja schön, dass dort ein daytime Server und allen möglichen Zeugs beschrieben wird, es aber leider keinen Hinweise gibt, wie ich einen Server programmieren kann, der mehrere Verbindungen aufnehmen kann.

    Es hat doch Beispiele von Servern, zum Beispiel ein Chatserver:
    http://www.boost.org/doc/libs/1_36_0/doc/html/boost_asio/example/chat/chat_server.cpp

    Zudem hat es mehrere HTTP Server:
    http://www.boost.org/doc/libs/1_36_0/doc/html/boost_asio/examples.html

    Du musst einfach immer nur mit einem acceptor und einem freien socket auf ankommende Verbindungen warten. Sobald eine ankommt, schickst du das socket weiter, für weiteren Empfang und Sendungen und lauschst wieder mit dem acceptor . Ganz normal, wie man es aus jedem Socket-Tutorial auch kennt.
    Das wäre allerdings vielleicht noch anzumerken. Die Boost Dokumentation ist kein wirkliches Tutorial. Wenn du also Socket (Netzwerk) Programmierung lernen willst, solltest du dich vielleicht zuerst nach anderen Tutorials oder Bücher umschauen. Die Boost Dokumentation setzt also meisten ein gewisses Grundwissen voraus.

    Grüssli


Anmelden zum Antworten