For-Schleife zählt nicht korrekt?
Hey,
Ich hab ne Methode geschrieben, die durch jeden Inventarslot in Minecraft geht, der eigentlich Inhalt ist egal, die Sache ist nur, dass die Schleife richtig unregelmäßig oder manchmal auch einfach gar nicht hochzählt.
Folgendes habe ich:
if (mc.currentScreen instanceof GuiInventory) {
for (int i = 0; i < 36; i++) {
if (timeHelper.hasReached(100)) {
mc.thePlayer.sendMessage(String.valueOf(i));
timeHelper.reset();
}
}
}
Das wird jeden Tick gecallt (1 Tick = 1/20 Sekunde).
Insofern das Delay 0 ist, funktioniert das tatsächlich auch (zählt unregelmäßig hoch, funktioniert aber)
Und wenn das Delay höher als null ist, zählt i gar nicht mehr hoch.
Wenn ich aber im Debug Modus das Schritt für Schritt durchgehe, funktioniert es.
Warum zählt die Schleife so gar nicht mehr hoch nachdem das Delay größer als 0 ist?
Danke schonmal im Voraus
Ach die TimeHelper Klasse noch, falls das was hilft:
public class TimeHelper {
private long lastMS = 0L;
public long getCurrentMS() {
return System.currentTimeMillis();
}
public boolean hasReached(final long milliseconds) {
return this.getCurrentMS() - this.lastMS >= milliseconds;
}
public void reset() {
this.lastMS = this.getCurrentMS();
}
}
2 Antworten
Die Schleife zählt garantiert richtig.
Du glaubst, das Programm läuft beim debuggen gleich - falsch.
Es gibt nämlich einen ganz entscheidendes Detail:
Du bist verdammt langsam ;)
Wenn Du das normal ausführst, ist die for-Schleife in unter einer Millisekunde durch.
Wie soll also währenddessen die Zeit um 100 Millisekunden weiter gelaufen sein?
Wenn Du debuggst, bist Du so lahm, dass schon durch nur einen Einzelschritt mehr als 100 Millisekunden vergangen sind.
Gar nicht.
Es gibt zwar Thread.sleep(), aber damit würdest Du den Main-Thread blockieren und das willst Du nicht. Eventuell kann man das asynchron machen, aber ich weiß nicht wie.
Merk dir, wann und wo Du zuletzt warst.
Mit jedem Tick machst Du dann da weiter, wo Du vorher warst - zumindest wenn die 100ms vergangen sind.
Der Timer läuft weiter und blockiert nicht den Thread, also deine for-Schleife.
Du kannst einen Thread-Pool erzeugen und das Versenden der Nachrichten dahin auslagern. Nach der for-Schleife wartest du, bis der Thread-Pool alle Threads abgearbeitet hat. Erst dann setzt du die weitere Ausführung fort.
Leuchtet ein.
Und wie mache ich dann, dass es an der Stelle wartet (bis 100ms vergangen sind)?