# konstanten Datenstrom erzeugen



## outbreaker (23. Mai 2007)

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 (23. Mai 2007)

wie wäre es mit einer for-oder wile-Schleife?
also

```
for(int i = 0; i < 10; i++);
senden
for...
```


----------



## outbreaker (23. Mai 2007)

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

ich habe das senden in einem Thread


```
...
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 (23. Mai 2007)

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:

```
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 (23. Mai 2007)

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 (24. Mai 2007)

Versuch doch mal 


```
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 (8. Jun 2007)

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


```
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


----------



## Ice-Tea (8. Jun 2007)

ok, hast mich überzeugt. Aber nen Versuch was wert


----------

