Boost Threads terminieren



  • Hallo Leute!

    Eine Frage zu Boost Threads:

    Ich erstelle einen Thread indem ich einen Server erstelle. Also listen...

    Wenn ich nun das Programm beenden möchte, kann ich den Thread nicht regulär beenden, das die listen Funktion ja blockiert.

    Also muss ich den Thread von außen terminieren.

    Geht das irgendwie?

    Gruß
    WAR][FIRE



  • Mach den socket einfach zu, dann kommt listen zurück.
    Threads beenden is Kacke^3.

    Entweder Socket zumachen, oder gleich den ganzen Prozess mit ExitProcess() wegmachen. TerminateThread is wie gesagt IMO ganz grosser Murks.



  • Das Problem ist, das ich den Socket in dem Thread erstelle, und da von außen nicht ran komm. Ich müsste im Thread noch einen Thread erstellen, der Guckt ob eine Variable gesetzt worden ist.



  • Hallo nochmal

    also er hängt ja bei

    acceptor.accept(socket);   //Listen an Port
    

    nun habe ich einen Thread parallel laufen, der wie folgt aussieht

    void foo::shutdown()
    {
    	while(!(*exit))wait(500);
    	if(!connected);
    		socket.close();
    	std::cout << "socket sollte geschlossen sein1\n";
    }
    

    Die funktion acceptor.accept(socket); blockiert/lauscht aber weiterhin am Port!

    was kann ich noch tun?

    Gruß
    WAR][FIRE



  • erledigt!!!

    acceptor.close(); funktioniert 🙂

    Dann ebend noch nen Thread, wat mut dat mut!

    Gruß
    WAR][FIRE



  • Er.
    Dann kommt accept zurück muss das natürlich heissen. listen() kommt ja gleich zurück. Ich Doofsack 🙂

    Ja, genau so kann man das machen.

    Wobei es mich wundert, dass du auf den "acceptor" Socket von ausserhalb des Thread keinen Zugriff hast. Ein eigener Thread, der nur dafür da ist zu warten dass das Programm beendet werden soll, sollte da IMO nicht nötig sein.



  • Hmm der Socket wird ja in einem Thread erstellt. Also ist er lokal nur in diesem Thread erreichbar. Da dieser aber bei einem listen Blockiert, kann ich auch nicht von außerhalb an den Socket rankommen.

    Der Thread den ich jetzt gebaut habe, läuft nur so lange bis ein Client connectet ist. Dann schließt er sich wieder, da er ja nichtmehr gebraucht wird.

    Mal ne andere Frage:
    Ich nutze Visual C++, und in meinem Programm habe ich leider noch ein paar Fehler die sparadisch aufftreten. Der Fehler liegt dann meist im Nirvana einer C++ Standartbibliothek. Wenn ich wüsste wo der Fehler her kommt, könnte ich diesen ja debuggen. Gibt es also eine art Rücksprungfunktion? Also das er nach dem Fehler mit einem Tastenkürzel in die vorherige Funktion springt und so weiter. Dann müsste ich am Ende ja bei meinem Programm ankommen 🙂

    Gruß
    WAR][FIRE


  • Administrator

    WAR][FIRE schrieb:

    Hmm der Socket wird ja in einem Thread erstellt. Also ist er lokal nur in diesem Thread erreichbar. Da dieser aber bei einem listen Blockiert, kann ich auch nicht von außerhalb an den Socket rankommen.

    Der Thread den ich jetzt gebaut habe, läuft nur so lange bis ein Client connectet ist. Dann schließt er sich wieder, da er ja nichtmehr gebraucht wird.

    Und wieso erstellst du nicht den Socket, bzw. Acceptor, ausserhalb des Threads und übergibst einen Verweis darauf dem Thread? Dann ist er auch ausserhalb verfügbar. Zudem scheint es, dass du Boost.Asio verwendest, da solltest du mal die asynchrone Seite von Boost.Asio anschauen.

    WAR][FIRE schrieb:

    Mal ne andere Frage:
    Ich nutze Visual C++, und in meinem Programm habe ich leider noch ein paar Fehler die sparadisch aufftreten. Der Fehler liegt dann meist im Nirvana einer C++ Standartbibliothek. Wenn ich wüsste wo der Fehler her kommt, könnte ich diesen ja debuggen. Gibt es also eine art Rücksprungfunktion? Also das er nach dem Fehler mit einem Tastenkürzel in die vorherige Funktion springt und so weiter. Dann müsste ich am Ende ja bei meinem Programm ankommen 🙂

    Nennt sich Call Stack. Das Fenster sollte eigentlich automatisch unten vorhanden sein im Debugmodus. Ich hätte aber keine Ahnung, wie man es holt, wenn man es weggeklickt hat 😃

    Grüssli



  • Jaaa!!! Danke Dravere! Dieses Call Stack Fenster ist für mich ein neu erreichter Meilenstein in der Programmierung 😃

    Der Fehler kommt von :

    if(!connected)
    		acceptor.close(); //Hier sitzt der Laufzeitfehler
    

    Mag er es evtl. nicht wenn man Ihn aus dem listen so rausholt?

    Manchmal klappt es und manchmal bekomme ich einen Laufzeitfehler!

    Gruß
    WAR][FIRE



  • Achherrjeh, das ist Boost.ASIO.
    Nein, die ASIO ist da etwas doof, deren Funktionen darf man nicht multithreaded aufrufen. Dummerweise ist aber der einfachste Weg sein Programm (sauber) zu beenden der, einfach alle Sockets zu schliessen.

    Mit "rohen" Sockets ist das auch kein Problem, bzw. auch nicht mit Socket-Klassen deren "close" Funktion man jederzeit aufrufen darf.

    Willkommen in der "doch-nicht-so-einfachen" Welt von ASIO.

    Dummerweise hab ich aber keine einfache Lösung für dein Problem.

    Was du machen könntest, wäre
    a) die asynchronen Funktionen der ASIO verwenden und
    b) alle deine Completion-Funktoren mittels eines "Strands" synchronisieren und
    c) das "close" auf den Socket in einem Funktor durchführen, den du über "dispatch" auf dem gleichen "Strand" ausführst, der auch für das "async_accept" zuständig ist

    Und ja, ich weiss, aber ich sagte ja ich habe keine einfache Lösung 🙂



  • Arg, das kann doch nicht angehen das man nicht aus nem lsiten bei Boost rausgehen kann....

    hustbaer ich kann mich nicht als hardcore Programmierer einstufe 😉

    Gibt es online evtl. ein paar Beispiele aus denen ich eine Lösung für mein Problem ableiten kann?
    Evtl. hast du ja was in deiner Code Sammlung 🙂

    Gruß
    WAR][FIRE


Anmelden zum Antworten