Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Pixma

Frischling

  • »Pixma« ist der Autor dieses Themas

Beiträge: 35

Wohnort: Mainz

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

1

08.11.2011, 14:15

Chat Programm, Thread wird nicht beendet [C#]

Hallo,
diese Funktion macht mir den Ärger und zwar führe ich die Funktion in einem Thread aus.

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 private void ListenForClients()
        {
            this.tcpListener.Start();
            while (runsApplication)
            {
                //blocks until a client has connected to the server
                TcpClient client = this.tcpListener.AcceptTcpClient();

                //create a thread to handle communication
                //with connected client
                Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
                clientThread.Start(client);
            }
        }

Wenn ich das Programm nun beendet, läuft dieser Thread immernoch, weil der nicht aus der Schleife herausgeht.
Ich hoffe ihr könnt mir ein paar Hilfestellungen geben, wie ich dieses Problem lösen kann.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

08.11.2011, 14:22

Ich versteh das Problem nicht ganz, wie sieht denn die Funktion aus, die in den gestarteten Threads ausgeführt wird? Wie genau sorgst du dafür, dass diese bei Programmende returned?

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

3

08.11.2011, 14:25

this.tcpListener.AcceptTcpClient() blockiert den aktuellen Thread bis eine Verbindung aufgebaut wird
sobald ein Client die Verbindung aufbaut wird ein weiterer Thread gesatertet (Schleife zu Ende) und solange die Anwendung noch läuft, wird die Schleife neu begonnen und wieder auf einen Client gewartet
an und für sich ist das richtig und nicht dsa Problem
sollte das Ergebnis von runsApplication später den Wert ändern, dann kann das erst ausgewertet werden, wenn sich ein weiterer Client verbindet
das heißt, du musst den Thread auch manuell beenden
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

DerMark

Treue Seele

Beiträge: 324

Wohnort: Emsdetten

Beruf: Softwareentwickler

  • Private Nachricht senden

4

08.11.2011, 14:31

Aus der MSDN:

Zitat

Use either AcceptSocket or AcceptTcpClient to pull a connection from the incoming connection request queue. These two methods will block. If you want to avoid blocking, you can use the Pending method first to determine if connection requests are available in the queue.


Prüfe also regelmäßig ob überhaupt jemand sich verbinden möchte und Accepte erst dann, dadurch wird erstmal der Thread nicht blockiert. Noch besser wäre es aber wenn du

http://msdn.microsoft.com/en-us/library/…ttcpclient.aspx

verwenden würdest, ist sicher komplexer zu benutzen, aber nimmt dir die Arbeit mit dem Thread ab.

Pixma

Frischling

  • »Pixma« ist der Autor dieses Themas

Beiträge: 35

Wohnort: Mainz

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

5

08.11.2011, 14:32

selbst das manuelle beenden, des Threads funktioniert nicht.
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
runsApplication = false;
listenThread.Abort()
}

Der mark:
Ok probier ich grade aus

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

08.11.2011, 14:35

Thread.Abort() ist keine Lösung. Der einzige richtige Weg um einen Thread zu beenden, ist ein return aus der Thread-Funktion.

Pixma

Frischling

  • »Pixma« ist der Autor dieses Themas

Beiträge: 35

Wohnort: Mainz

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

7

08.11.2011, 14:40

danke, der Mark.
Ich konnte das Problem lösen

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 private void ListenForClients()
        {
            this.tcpListener.Start();
            while (runsApplication)
            {
                //blocks until a client has connected to the server
                //TcpClient client = this.tcpListener.AcceptTcpClient();
                tcpListener.BeginAcceptTcpClient(
                new AsyncCallback(HandleClientComm),
                tcpListener);
                //create a thread to handle communication
                //with connected client
                //Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
                //clientThread.Start(client);
            }
        }


Dot, danke ebenfalls, nun bin ich das nächste mal Gerüstet, wenn ich wieder einmal mit Threads arbeiten muss :)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

08.11.2011, 19:41

DAS ist eine prima Lösung, wenn Du den gesamten Speicher und die gesamte CPU-Last Deines Rechners auf einmal verbraten willst.
Das Ding heißt ja nicht umsonst AsyncCallback!
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Pixma

Frischling

  • »Pixma« ist der Autor dieses Themas

Beiträge: 35

Wohnort: Mainz

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

9

09.11.2011, 08:50

hmm ja ich habs gemerkt. :P
Also ist das doch keine gute Lösung?
auch dafür habe ich eine Lösung gefunden :)

C#-Quelltext

1
Thread.sleep(200);

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

10

09.11.2011, 08:56

Wenn der Thread ehhh bis Programmende laufen soll, warum nicht alles per EndProcess oder sowas beenden?

Werbeanzeige