konstanten Datenstrom erzeugen

Status
Nicht offen für weitere Antworten.

outbreaker

Bekanntes Mitglied
Hallo

ich schreibe gerade an einem Netzwerkprogramm welches konstant Datenpakete schicken soll. Nun ist mein Problem das ich meine Thread zwar mit sleep für zb eine Millisekunde schlafen legen kann dann erreiche ich aber nur eine Maximalübertragungsrate von 6Mbit. Da sind zwar die Datenpakete schön gleichmäßig verteilt aber ich bekomme keine höhere Daterate hin als 6Mbit da der kleinste sleep 1ms ist.
im Moment mache ich senden sleep senden .... So komme ich auf ca 512 pakete ah 1500Byte
Wenn ich den Sleep weg lasse komme ich so min 70Mbit nun Möchte ich aber was zwischen 6 und 70 haben.

habe es auch schon mal mit pakete zählen gemacht aber dann ist der Traffic ja Burstartig welches ich ja nicht erreichen möchte.

hat jemand eine andere idee wie man das mit höheren Datenraten realisieren kann? oder hat sowas schonmal jemand gemacht?

Danke
cu
 

madboy

Top Contributor
wie wäre es mit einer for-oder wile-Schleife?
also
Code:
for(int i = 0; i < 10; i++);
senden
for...
 

outbreaker

Bekanntes Mitglied
mhm ich glaube ich habe mich falsch ausgedrückt :autsch:

ich habe das senden in einem Thread

Code:
...
getUdpSocket().send(getPaket());
try 
{
  Thread.sleep(XXX);
}
catch (InterruptedException ie)
{
  ErrorAusgabe
}

...

Nun sendet er und wartet eine bestimmte zeit dann sendet er wieder
das soll unendlich so weiter gehen

Aber ich möchte halt vorher sagen können sende mit der Mbitrate von XXX
das heißt ich müsste den sleep beeinflussen weil das ja auch die Datenrate beeinflusst
aber soweit ich das bis jetzt mitbekommen habe ist es schwer den sleep zu beinflussen wenn er kleiner als 1ms sein soll

hab zum sleep noch nen anderen Thread: http://www.java-forum.org/de/viewtopic.php?t=49621

oder habe ich deine Idee falsch verstanden?
 

madboy

Top Contributor
der Unterschied zwischen sleep und einer for-Schleife, die nur zählt ist eigentlich nicht so groß. Bei sleep gibst du halt den Prozessor frei dass ein anderer Thread laufen kann, bei einer Schleife nicht.

Du musst eigentlich nur herausfinden, wie lange du zählen musst, um eine bestimmte Zeit beschäftigt zu sein.

So ähnlich stelle ich mir das vor:
Code:
int x = 1000;
while( true ) {
  if (gewünschte Datenrate > aktuelle Datenrate){
    x += 10;
  } elseif (gewünschte Datenrate < aktuelle Datenrate){
    x -= 10;
  }

   for(int i = 0; i < x; i++); //ersetzt Thread.sleep()
   
  getUdpSocket().send(getPaket());
}

Was anderes fällt mir im Moment nicht ein, um kurze Zeit zu warten wenn das mit sleep nicht klappt.

Gruß,
madboy

EDIT: natürlich wird bei dieser Methode die Prozessorauslastung irgendwo im Bereich von 100% liegen.
 

outbreaker

Bekanntes Mitglied
Die Idee an sich ist ja gut und funktioniert auch für einen Datenstrom ganz gut aber wenn ich dann mehrere Parallel habe dann funktioniert es nicht mehr

dann ist das Programm nur am regeln weil mal bekommt der Thread mehr Rechenleistung bekommt dann der andere
und mein Rechner ist zu 100% ausgelastet da die Threads ja immer rechnen :bahnhof:
 

Ice-Tea

Bekanntes Mitglied
Versuch doch mal

Code:
sleep(0,1); // 	sleep(long millis, int nanos)

EDIT:
Bedenke aber, das auch dann der Rechner nur am werkeln ist.

Denn 1 Nanosek. ist für ein Prozessor der 1 Mrd. Takte (1Ghz) in der Sekunde macht nicht viel ;)
 

outbreaker

Bekanntes Mitglied
Ich habe mir mal diese Sleep funktion mit den Nanos angesehen und finde nicht das die dafür sorgt das in Nanosekunden gesleept wird ;-)

hier mal Quelltext aus OpenJava

Code:
public static void sleep(long millis, int nanos)
    throws InterruptedException {
	if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
	}

	if (nanos < 0 || nanos > 999999) {
            throw new IllegalArgumentException(
				"nanosecond timeout value out of range");
	}

	if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
	    millis++;
	}

	sleep(millis);
}

Das sagt mir ja das er dann doch nur Millisekunden schläft
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben