Thread

Gilli

Mitglied
Hallo!

Ich habe folgendes Problem:
Ich versuche eine "Ping" Programm zu schreiben, dabei verwende ich eine fixfertig Klasse mit der Bezeichnung: CDWPing.
Soweit funktioniert alles bestens jetzt will ich jedoch mehrere Pings gleichzeig starten (mit Threads) hier ein Ausschnitt meines Codes:
Code:
Main:
Thread myTh = new Thread(new ThreadStart(myPingThread));
myTh.Start();

private void myPingThread()
{
	PingDLL.Class1.CDWPing myPing = new PingDLL.Class1.CDWPing();
	.
	.
	.
}
Wenn ich jetzt jedoch mehrere dieser Threads erstell dann erhalte ich für alle Threads das gleiche Ergebniss und zwar das von dem als erster gestartete Thread :confused:
Kann es sein das sich das mit "new" erstellte Objekt irgenwie mit den anderen erstellten Objekte vermischt oder so ähnlich? Weiss jemand wie man das beheben kann?
:confused:
 
Hallo!

Ich versuche mit mehreren Thread gleichzeitig verschiedene Ip Adressen zu pingen.
Hier ein Beispielt wenn ich nur ein Thread verwende das alle Ips nacheinander pingt:
192.168.0.1 Antwort: erreichbar
192.168.0.2 Antwort: nicht erreichbar
192.168.0.3 Antwort: erreichbar
192.168.0.4 Antwort: nicht erreichbar
192.168.0.5 Antwort: nicht erreichbar
192.168.0.6 Antwort: erreichbar
Wenn ich jetzt jedoch 6 Threads gleichzeitig starte die alle eine der Ip's verwenden soll - erhalte ich immer nur ein ergebnis und zwar das von dem ersten Thread, Bsp:
192.168.0.1 Antwort: erreichbar
192.168.0.2 Antwort: erreichbar
192.168.0.3 Antwort: erreichbar
192.168.0.4 Antwort: erreichbar
192.168.0.5 Antwort: erreichbar
192.168.0.6 Antwort: erreichbar
Obwohl das Ergebniss natürlich nicht stimmen kann, da nicht alle Ips verwendet werden.
 
Hier mein Code:

Code:
private void button_ping_Click(object sender, System.EventArgs e)
{
Thread myTh01 = new Thread(new ThreadStart(myPingThread01));
myTh01.Start();
Thread myTh02 = new Thread(new ThreadStart(myPingThread02));
myTh02.Start();
}

private void myPingThread01()
{
PingDLL01.Class1.CDWPing myPing03 = new PingDLL01.Class1.CDWPing();
short sAnswer1 = myPing03.ping(@"10.111.4.2"); //Das Ergebnis müsste 1 lauten!
MessageBox.Show("10.111.4.2 = " + sAnswer.ToString());}

private void myPingThread02()
{
PingDLL01.Class1.CDWPing myPing03 = new PingDLL01.Class1.CDWPing();
short sAnswer = myPing03.ping(@"10.111.4.3"); //Das Ergebnis müsste 0 lauten!
MessageBox.Show("10.111.4.3 = " + sAnswer.ToString());
}

In diesem Beispiel müsste ich als korrektes Ergebnis zwei MessageBoxen bekommen:
10.111.4.2 = 1
10.111.4.3 = 0
Leider erhalte ich beidemale 1, da sich das eine Thread irgenwie mit dem anderen "schneidet".




Wenn ich jedoch das selbe mit einer Pause machen, würde das Ergebnis stimmen:
Code:
Thread myTh01 = new Thread(new ThreadStart(myPingThread01));
myTh01.Start();
MessageBox.Show("PAUSE!!"); 
Thread myTh02 = new Thread(new ThreadStart(myPingThread02));
myTh02.Start();
10.111.4.2 = 1
PAUSE!!
10.111.4.3 = 0

Bitte bitte helft!
 
Hmmm, so wie ich das sehe rufst du in beiden Threads
Code:
PingDLL01.Class1.CDWPing myPing03 = new PingDLL01.Class1.CDWPing();
Auf, das heisst du lässt myPing03 einfach doppelt nebeneinander laufen, was meiner meinung nicht viel Sinn macht, da myPing03 nur eine Variabel/Instanz oder was auch immer ist, beinhaltet sie auch den selben wert, und zwar den, vom Thread, mit der höheren Priorität, sprich hier deinem ersten Thread sprich Wert 1. Wenn du ne Pause machst, hast du Thread1 = 1 pause und dann überschreibst du dein myPing03 einfach mit der zweiten Abfrage, weshalb dein Resultat stimmt.

Folglich:
Für jeden Thread ne eigene myPing03 instanzieren, und es müsste meiner Meinung nach gehen, obwohl meine Meinung auch meinen kann, das sie falsch meint ;)

so long
ziop
 
Hi.

zioProduct, in den beiden Methoden die da in einem neuen Thread gestartet werden, wird 2 mal ein Objekt instanziert. Sie haben zwar den selben Namen, aber aufgrund des Scopes kann die eine Instanzierung die andere nicht beeinflussen.

Woher ist denn diese Ping-Klasse?

MfG,
Alex
 

Neue Beiträge

Zurück