Thread beenden wenn der eine "blocking function" ausführt



  • Hallo,

    Ich hab einen Thread, der eine blocking Function (socket->receive) ausführt. Wenn ich jetzt z.B. die IP-Adresse ändern möchte, muss ich ja diesen Thread beenden. Jetzt hab ich gelesen, dass man das vernünftig nur erreicht, wenn man in die Funktion ein "return" einbaut und die dann gracefully endet.

    Mein Workaround sieht so aus, dass ich von extern ein Flag setze, der der Funktion dann sagt, dass sie enden soll.

    this->ts = gcnew ThreadStart(this,&MyClass::receive);
    Boolean EndThread = false;
    ...
    receive(){
        while(1){
            if(EndThread) return;
            UDPBufferCount = RecvSocket->Receive(UDPBuffer);
        }
    }
    

    Klappt auch. Aber die Funktion Socket->Receive blockt und läuft nur weiter, wenn sie was empfangen hat. Wenn ich pech hab und jemand den Netzwerkstecker zieht, kann das sein, dass sie ewig da hängt und mein EndThread garnicht erkannt wird.

    Man kann dem Socket einen TimeOut-Wert geben, nachdem Receive dann auf jeden Fall aufgibt und weiterläuft. Blöderweise raised der dann auch eine SocketException.

    Wie kann ich denn jetzt den Thread vernünftig beenden???

    Danke & LG



  • Fange doch die SocketException und verlasse dann die Funktion.



  • Hm. Ich hab das jetzt mal so wie du sagst gemacht und es klappt auch. Jetzt bin ich hier aber auf eine Sache gestoßen, die ich nicht verstehe.

    Ich müsste ja eigentlich noch wissen, wann der Thread beendet ist. Denn erst dann kann ich den Neuen starten. Es könnte ja einige Sekunden dauern, bis receive dann abbricht. Das ginge zB mit einem hässlichen ...

    while(thread->isAlive){
    //wait
    }
    //sockets neustarten, thread starten
    

    Jetzt hab ich das aber nicht gemacht und es funktioniert trotzdem. Dann hab ich testweise mein "return", das den Thread beenden soll, wieder aus der receive Funktion entfernt und es geht immernoch. Ich überschreibe einfach den laufenden Thread komplett mit ...

    this->ts = gcnew ThreadStart(this,&MyClass::receive);
    		this->trs = gcnew Thread(ts);
    		this->trs->IsBackground = true;
    		this->trs->Start();
    

    Es kommt keine Exception und er empfängt auch Daten. 😮

    Häää?



  • Mit Thread::Join(..) kannst Du warten bis der Thread beendet wurde.



  • Super. War nicht einfach das jetzt einzubauen, aber jetzt scheint es vernünftig zu sein.

    Danke!


Anmelden zum Antworten