Lua - I%5 == 0

!!! Please ensure, that your contribution or question is placed into the relevant section !!!
Questions about rolling stock, for example, do not belong in "Questions about the Forum". Following is perhaps the right area where your question will be better looked after:
General questions to EEP , Splines, rolling stock, Structures in EEP, landscape elements, Signalling system and controlling, designers, Europe-wide EEP meetings , Gossip
Your cooperation to keep the forum clear is appreciated.
In the case of pictures that are attached to the article, the source must also be stated. This also applies to your own pictures, which were taken by you. Pictures without source information will be deleted!
  • Wenn man Aufgaben, die sich regelmäßig wiederholen, in der EEPMain() ein bisschen verteilen möchte, dann kann man sich überlegen, ob diese Wiederholung permanent stattfinden muss.

    Vielleicht reicht es ja auch, wenn man es nur einmal je Sekunde macht?

    Oder nur alle paar Sekunden einmal?


    Im Basisskript wird eine Variable I angelegt und mit 0 initialisiert.

    In der EEPMain() Schleife wird der Wert bei jedem Durchlauf um 1 erhöht I = I + 1

    Der Modulo-Operator % gibt den Rest einer Teilung zurück.

    7 geteilt durch 5 ist 1 Rest 2

    7 % 5 == 2


    Mit I % 5 bekommt man reihum immer wieder die Zahlen von 0 bis 4.

    Also kann man mit if I % 5 == 0 then prüfen, ob es sich um den ersten von 5 Durchläufen handelt.

    Dann ist eine Sekunde vergangen.

    Nach I % 10 == 0 sind zwei Sekunden vergangen.

    Und so weiter


    Spart man damit etwas?

    Hat Lua es dadurch leichter?

    Nein. Denn es bekommt dadurch nicht mehr Zeit für die Erledigung der Aufgaben. Es muss trotzdem alles auf einmal machen.


    Interessant wird es erst, wenn ich in jedem Durchlauf nur einen Teil der Dinge erledige, die zu tun sind.


    bringt überhaupt keine Verbesserung, weil EEP trotzdem alles auf einmal machen muss. Dass das nur einmal je Sekunde geschieht, ändert daran doch nichts. Und dass die fünfte Aufgabe nur alle zwei Sekunden ausgeführt wird hilft auch nichts, wenn dieser Augenblick derselbe ist, in dem auch der sekündliche Kram zu erledigen ist.


    Aber so, wie I%5 nur jedes fünfte Mal eine 0 ausgibt, so gibt es auch nur jedes fünfte Mal eine 1 aus. Und nur jedes fünfte Mal eine 2.


    Eine winzige Änderung macht das obige Skript wirklich flüssiger:


    Jetzt hat Lua in jedem EEPMain() Durchlauf ein bisschen zu tun und steht nie vor einem Berg Arbeit. :ae_1:


    Viel Spaß beim Ausprobieren :aa_1:

    The post was edited 2 times, last by Goetz ().

  • Wenn man wissen will wie lange eine aufwändige Aktion dauert kann man dies auf Millisekunden genau folgendermaßen berechnen und anzeigen:


    LUA Source Code
    1. local t0 = os.clock() -- milliseconds precision
    2. -- Hier die Aktion durchführen
    3. -- ...
    4. local t1 = os.clock()
    5. print("Dauer der Aktion: " .. string.format("%.3f", t1-t0) .. " sec")


    Insbesondere kann man so auch die gesamte EEPMain() ausmessen.


    EEPMain() wird nur dann automatisch bereits nach 200 ms = 0.2 sec aufgerufen, wenn die vorherigen Aufrufe abgeschlossen sind. Ansonsten wird der Aufruf in eine Warteschlange gestellt. Es ist also durchaus wichtig, je Aufruf unterhalb dieser Zeit zu bleiben.

  • Ansonsten wird der Aufruf in eine Warteschlange gestellt.

    Heißt das, EEP holt die Aufrufe nach, sobald die Zeit dazu verfügbar ist, oder fallen sie ggf. für einen Durchlauf komplett weg?

    Betriebssystem: Windows 7 Ultimate N 64 Bit (inkl. Media Pack)

    Arbeitsspeicher: 32 GB RAM

    Prozessor: Intel(R) Core(TM) I5-2320 CPU 3GHz

    Grafikkarte - Zotac Geforce GTX 1050 ti - 4GB

    Motherboard: Asus P8H67-M PRO mATX Mainboard Sockel LGA1155

    Festplatte: SSD: 128 GB

    EEP 14.1, 16.4 (Plugin 2)

    Mittlerweile auch EEP17 installiert

  • Nur zur Sicherheit, dass das niemand als Vorlage verwendet: Die folgende Bedingung (aus Götz' erstem Beispiel) wird niemals erfüllt werden:

    LUA Source Code
    1. I%5 == 10

    I%5 ergibt Werte zwischen 0 und 4, 10 wird niemals erreicht.


    Um "bis zehn zu zählen" (was laut Text wohl der Sinn davon ist), müsste es I%10 == 0 heißen. Statt der 0 kann (bzw. natürlich genausogut eine andere Zahl verwendet werden.


    Viele Grüße

    Benny

  • Um "bis zehn zu zählen" (was laut Text wohl der Sinn davon ist), müsste es I%10 == 0 heißen.

    richtig. Das hatte ich gemeint.

    Sorry für den Flüchtigkeitsfehler und danke, Benny, fürs Aufdecken :be_1:

    Ich habe es oben korrigiert.

  • LUA Source Code
    1. if I%5 == 0 then Bahnhofsausfahrt_Nord()
    2. elseif I%5 == 1 then Bahnhofsausfahrt_Sued()
    3. elseif I%5 == 2 then Bahnhofseinfahrt_Nord()
    4. elseif I%5 == 3 then Bahnhofseinfahrt_Sued()
    5. elseif I%5 == 4 then Betriebswerk()
    6. end

    LG Lelf