Alternative zu einem Loop?



  • Guten Tag,
    Ein code aus meinem Programm läuft zurzeit in einem while(1) Loop jedoch suche ich nach einer alternative. Müsste ich dafür std::theared oder ein Callback verwenden und wenn ja wie mache ich das.

    Als nebeninfo: Der Code ist ein Listener der darauf wartet bis ein Packet eintrifft und ausgibt welchen identifer das Packet hat (Packet Logger)



  • jaman schrieb:

    ... jedoch suche ich nach einer alternative.

    Warum?



  • Weil der Loop undendlich ist jedoch weitere codes nach dem loop ausgeführt werden sollen



  • Stichwort "break"



  • break; würde den Loop unterbrechen ich will ihn aber die ganze Zeit laufen lassen.



  • jaman schrieb:

    break; würde den Loop unterbrechen ich will ihn aber die ganze Zeit laufen lassen.

    wenn aber dinge erst ausgeführt werden sollen, wenn der loop durch ist, dann kann er da ja nicht mehr weiter laufen...



  • jaman möchte wohl den Listener (=die while-Schleife) asynchron in einem Thread starten und anschließend im Mainthread weiterlaufen?!?

    @jaman: Packe deinen Listener-Code in eine eigene Funktion und benutze dann std::thread.

    Unter Multithreading in C++0x part 1: Starting Threads ff. gibt es auch einige weitere Codebeispiel dazu.

    Beachte aber, daß du die Thread-Variable in einen Scope packst, der lang genug lebt (z.B. in der main-Funktion).



  • @TH69 Wow danke darf ich auch diesen Thread in einen Constructer packen?



  • Als Membervariable ja (innerhalb des Konstruktor-Blockes macht dagegen wenig Sinn, da es sofort wieder out-of-scope wäre - und damit dessen Destruktor aufgerufen werden würde):

    class MyClass
    {
      std::thread mythread;
    
      static void myfunc()
      {
        while(true)
        {
          // do the loop and listen to packages
        }
      }
    
    public:
      MyClass() : mythread(myfunc)
      {   
      }
    }
    

    Natürlich muß dann das Klassenobjekt lange genug existieren.

    Und wenn myfunc eine nichtstatische Memberfunktion sein soll (falls die Funktion Membervariablen benutzt), dann steht es ja im verlinkten Artikel (part 3), wie der Aufruf aussehen muß.



  • Ok vielen dank das hat mir seh geholfen 🙂


Log in to reply