Hallo,
ich habe ein mehr oder weniger gut geschriebenes Programm, in dem mehrere Unteraufgaben erledigt werden.
Für manche der Unteraufgaben will ich einfach dass das Programm (natürlich) die Aufgabe ausführt.
Aber ich will auch von der aufgewendeten zeitdauer her ein wenig Struktur reinbringen.
Daher will ich für eine gegebene Aufgabe hinkriegen dass er die Aufgabe erledigt und aber, sollte weniger Zeit als eine gegebene Zeitspanne vergangen sein, er noch bis dahin wartet.
Wenn ich dem programm also bspw. als Unteraufgabe gebe, es soll die Zahlen 1-1000 in der Konsole drucken.
Und gebe als Zeitspanne 4 Sekunden vor.
Dann will ich dass er die 1000 Zahlen auf der Konsole ausgibt, selbstredend.
Und dann aber , seit Beginn der Aufgabe noch keine 4 Sekunden rum sein, dass er so lange wartet bis eben 4 sekunden rum sind.
Falls er für die eigentliche aufgabe so schon länger als 4 sekunden gebraucht hat, soll er gar nix extra tun.
Damit kann ich sicherstellen dass das pogramm in jedem fall eine Zeit von max{Länge der Aufgabe, 4 sekunden} braucht.
Klar ist das sinnfrei, aber mit etwas gedrehe an der vorgegebenen Zeitspanne kann ich dann bspw. sicherstellen dass er für eine Aufgabe, je nach CPU AUslastung und so,
nicht einmal 1.97 sekunden, dann 3.54, dann 2,31 sekunden braucht.
sondern konstant 4 sekunden (falls ich halt durhc trial and error recht sicher weiß dass er nie länger als 4 sekunden für die aufgabe braucht und 4 sekunden als zeitspanne vorgebe)
Frage ist nun, wie umsetzen?
Habe einige Aufgaben im Skript, mit unterschiedlichen vorzugebenden Zeitdauern.
Mein naives Vorgehen wäre die folgt:
Eine Methode wie folgt definieren:
Dann im Objekt (Alles passiert in dem eine bestimmten Objekt) ein Attribut Starttime einbauen, das ich bei bedarf anpassen kann.
Wo auch immer eine Aufgabe kommt, dann sowas wie
wenn ich 4 sekunden=4000 millisekunden dauer haben will.
Aber da muss ich halt überall vor einer aufgabe das starttime attribut ändern bzw. für gleichzeitig beobachtete Sachen separate starttime attribute bauen (wenn ich bspw. gleichzeitig die dauer des gesamtprogramms und die von unteraufgaben C7 beobachten will, braucht es ja 2 attribute aka variabeln um die untershciedlichen startzeiten zu tracken)
Hat Jemand eine bessere Idee wie ich das Ganze umsetzen könnte?
Bin noch nicht so wirklich zufrieden damit, obwohl es den Zweck wohl erfüllen sollte.
shcön ist es halt aber nicht wenn die startzeit als attribut gespeichert wird und eben die methode aufgerufen werden muss.
Habe so das gefühl, so eine art countdown müsste man irgendwie intelligenter hinbekommen können :-/
Bevor ich diese idee aufgriff, hatte ich bspw. einfahc einen 20 sekunden sleep hinter jede aufgabe gepackt.
Was natürlich witzlos ist, da wartet dann die meiste zeit das programm "auf schön Wetter" wo es längst weiterarbeiten könnte.Und an anderer stelle habe ich den sleep womöglich zu kurz angesetzt sodass es nicht mehr läuft wie gewohnt.
(Mein programm hängt auch von "äusseren geschehnissen" ab, bspw. klickt mein Programm einen button, nach einer gewissen zeit erscheint dann ein button und ds programm soll die farbe des buttons ablesen. viel variable zeitdauern drin, die ich aber effizienztechnisch halbwegs eingrenzen will)
ich habe ein mehr oder weniger gut geschriebenes Programm, in dem mehrere Unteraufgaben erledigt werden.
Für manche der Unteraufgaben will ich einfach dass das Programm (natürlich) die Aufgabe ausführt.
Aber ich will auch von der aufgewendeten zeitdauer her ein wenig Struktur reinbringen.
Daher will ich für eine gegebene Aufgabe hinkriegen dass er die Aufgabe erledigt und aber, sollte weniger Zeit als eine gegebene Zeitspanne vergangen sein, er noch bis dahin wartet.
Wenn ich dem programm also bspw. als Unteraufgabe gebe, es soll die Zahlen 1-1000 in der Konsole drucken.
Und gebe als Zeitspanne 4 Sekunden vor.
Dann will ich dass er die 1000 Zahlen auf der Konsole ausgibt, selbstredend.
Und dann aber , seit Beginn der Aufgabe noch keine 4 Sekunden rum sein, dass er so lange wartet bis eben 4 sekunden rum sind.
Falls er für die eigentliche aufgabe so schon länger als 4 sekunden gebraucht hat, soll er gar nix extra tun.
Damit kann ich sicherstellen dass das pogramm in jedem fall eine Zeit von max{Länge der Aufgabe, 4 sekunden} braucht.
Klar ist das sinnfrei, aber mit etwas gedrehe an der vorgegebenen Zeitspanne kann ich dann bspw. sicherstellen dass er für eine Aufgabe, je nach CPU AUslastung und so,
nicht einmal 1.97 sekunden, dann 3.54, dann 2,31 sekunden braucht.
sondern konstant 4 sekunden (falls ich halt durhc trial and error recht sicher weiß dass er nie länger als 4 sekunden für die aufgabe braucht und 4 sekunden als zeitspanne vorgebe)
Frage ist nun, wie umsetzen?
Habe einige Aufgaben im Skript, mit unterschiedlichen vorzugebenden Zeitdauern.
Mein naives Vorgehen wäre die folgt:
Eine Methode wie folgt definieren:
Java:
public void sleeptilltarget(long startTime, long targetmilliTime){
long tosleep=1000000*targetmilliTime-(System.nanoTime()-startTime);
if(tosleep>10000000){//10 milliseconds
try{
long millis= (long) (tosleep / 1000000.0);
Thread.sleep(millis);
}
catch(Exception e){}
}
return;
}
Dann im Objekt (Alles passiert in dem eine bestimmten Objekt) ein Attribut Starttime einbauen, das ich bei bedarf anpassen kann.
Wo auch immer eine Aufgabe kommt, dann sowas wie
Code:
StartTime=System.nanoTime();
//hier dutzende Zeilen die die Aufgabe erledigen
sleeptilltarget(StartTime,4000);
wenn ich 4 sekunden=4000 millisekunden dauer haben will.
Aber da muss ich halt überall vor einer aufgabe das starttime attribut ändern bzw. für gleichzeitig beobachtete Sachen separate starttime attribute bauen (wenn ich bspw. gleichzeitig die dauer des gesamtprogramms und die von unteraufgaben C7 beobachten will, braucht es ja 2 attribute aka variabeln um die untershciedlichen startzeiten zu tracken)
Hat Jemand eine bessere Idee wie ich das Ganze umsetzen könnte?
Bin noch nicht so wirklich zufrieden damit, obwohl es den Zweck wohl erfüllen sollte.
shcön ist es halt aber nicht wenn die startzeit als attribut gespeichert wird und eben die methode aufgerufen werden muss.
Habe so das gefühl, so eine art countdown müsste man irgendwie intelligenter hinbekommen können :-/
Bevor ich diese idee aufgriff, hatte ich bspw. einfahc einen 20 sekunden sleep hinter jede aufgabe gepackt.
Was natürlich witzlos ist, da wartet dann die meiste zeit das programm "auf schön Wetter" wo es längst weiterarbeiten könnte.Und an anderer stelle habe ich den sleep womöglich zu kurz angesetzt sodass es nicht mehr läuft wie gewohnt.
(Mein programm hängt auch von "äusseren geschehnissen" ab, bspw. klickt mein Programm einen button, nach einer gewissen zeit erscheint dann ein button und ds programm soll die farbe des buttons ablesen. viel variable zeitdauern drin, die ich aber effizienztechnisch halbwegs eingrenzen will)