Laden...

Thread am Leben erhalten

Erstellt von Nachtwind vor 18 Jahren Letzter Beitrag vor 18 Jahren 1.567 Views
N
Nachtwind Themenstarter:in
118 Beiträge seit 2005
vor 18 Jahren
Thread am Leben erhalten

Also, ich habe folgende Programmkonstellation.
Mein Programm startet, bindet sich an einen Port und wartet auf Verbindungen. Wenn eine Verbindung aufgebaut wird, wird ein Thread gestartet, der diese Verbindugn annimmt.
Jetzt soll das Programm aber den Socket bereithalten und auf Daten Warten. Leider bekomme ich nun aber dauernd die Meldung, daß die IO Operation wegen des Abbruch des Threads auch abgebrochen wurde. Jetzt stellt sich mir die Frage, wie ich dem thread klarmachen kann, daß er solange laufen soll, wie der Socket verbunden ist (bzw der User auf der anderen Seite) und auf Daten warten soll.

Hat hier jemand eine Idee, wie das zu machen ist?

P
939 Beiträge seit 2003
vor 18 Jahren

Bisschen Code wäre hilfreich gewesen.

Ich würde vermuten, dass dein Thread ohne Schleife ausgeführt wird. Ein Thread wird beendet, sobald die als ThreadStart oder ähnlich übergebene Methode zurückkehrt. Du brauchst eine Schleife, die solange läuft, bis der Client die Verbindung schliesst.

Den Verbindungsaufbau würde ich auch in den Thread verlagern. AcceptSocket oder AcceptTcpClient blockieren ansonsten genauso den Rest der Anwendung.

Gruss
Pulpapex

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo zusammen,

Du brauchst eine Schleife, die solange läuft, bis der Client die Verbindung schliesst.

Aber bitte keine leere Schleife, die die Prozessorlast auf 100% treibt. Also entweder eine mit Thread.Sleep oder noch besser eine Semaphore (z.B. ManualResetEvent) statt einer Schleife verwenden. BTW: Semaphoren sind nichts kompliziertes, sondern funktionieren wie einfache Verkehrsampeln (mit den Operationen: auf Grün warten, auf Rot schalten, auf Grün schalten).

herbivore

N
Nachtwind Themenstarter:in
118 Beiträge seit 2005
vor 18 Jahren

Danke, die Idee mit der schleife hatte ich auch schon, dachte aber nie an die Sleep funktion, so klappts nun aber, vielen dank 🙂

P
939 Beiträge seit 2003
vor 18 Jahren

Thread.Sleep oder WaitHandles sind überhaupt nicht notwendig. Das Lesen des Sockets blockiert schon ohne Zutun die Threadausführung, wenn keine Daten gesendet werden. Die Schleife ist nur dafür da, um blockweise Daten zu empfangen und mitzubekommen, wenn der Client die Verbindung schliesst.

Thread.Sleep solltest du wieder ausbauen. Das verlangsamt nur künstlich die Ausführung.

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Pulpapex,

es ging ja um zwei Threads. Ich habe es so verstanden, dass es darum geht, den Thread am Leben zu halten, der nicht die Verbindung annimmt. Wenn ich es jetzt nochmal lese bin ich nicht mehr sicher, welcher Thread eigentlich gemeint ist. Aber die positive Antwort von Nachtwind bezüglich des Thread.Sleep spricht zumindest dafür, dass er den gleichen Thread meint wie ich.

herbivore

N
Nachtwind Themenstarter:in
118 Beiträge seit 2005
vor 18 Jahren

So war es auch und danke nochmal, so klappts nun so wie es soll 🙂