blocking-select abbrechen?



  • Moin,

    ich habe ein selct, das blockt... und blockt... und blockt...
    und irgendwann soll er damit aufhören.

    wie kann ich ein select abbrechen?

    mit recv geht das ja per closesocket([...]), gibt's doch bestimmt auch für mein problem.

    Euer ItsNotYou



  • du kannst ein timeout als letzten parameter übergeben oder wenn ein neues event eintrifft überprüfen, ob die schleife verlassen werden soll.



  • Geht das ganze auch ohne timeout?



  • Versuch mal die Sockets zu schließen, dann werden glaub ich Read-Events ausgelöst.



  • Es handelt sich bei denen Funktionen welche du einsetzt um sog. 'Blocking Calls'. Das bedeutet das die Funktion erst zurückkehrt sobald das gewünschte Event aufgetreten ist. Solche Funktionen sind unter anderem recv() und accept() wie man sie aus der Socketprogrammierung kennt.
    Am leichtesten ist es wenn du diese Funtkionen in einem Thread aufrufst, der im Hintergrund läuft.

    Mein Vorschlag: benutze CreateThread() oder _beginthreadex()

    Ich denke das hilft dir weiter. 😉



  • jo, ich habe diese funktion bereits im thread, jetzt soll das ganze aber auf knopfdruck abbrechbar sein.

    ich habe das jetzt so gelöst, das ich eine variable ende auf 1 setzt (int) und ein anderer thread (der "stop"-thread) dann einfach etwas an den accept-Socket schickt (der immer active ist). direkt nach dem select, d.h. wenn das select zurükkommt, so dass es förmlich drüber stolpert, ist eine ende==1 abfrage, wenn das zutrifft wird aus der schleife gesprungen.

    etwas unkonventionell aber funktioniert.

    Euer ItsNotYou



  • ItsNotYou schrieb:

    ich eine variable ende auf 1 setzt...etwas unkonventionell aber funktioniert.

    gar nicht mal. das mit der variablen nennt sich "einen thread vergiften" und ist die standar-methode, einen thread zu beenden, damit er auch fein die chanche hat, seine destruktoren aufzurufen.
    und das schicken von blödsinnigen daten, nur damit er aus nem blocking call rauskommt, ist dann auch naheliegend. also ich würd's genauso machen.



  • warum nicht closesocket? oder hat das nicht geklappt?


Anmelden zum Antworten