Jump to content

Keine Verzögerungen bei Wiederholungen möglich


BahnLand

Empfohlene Beiträge

Hallo @Neo und EV-Anwender,

ich habe nun etwas mit den Wiederholungen herumgespielt und dabei festgestellt, dass man bei Wiederholungen - zumindest im grafischen Teil der EV - keine Verzögerungen einbauen kann.

178683461_02VerzgerunginListe.thumb.JPG.32a098e6e4b0b5466dce2235a716999f.JPG

Das wird zwar ganz oben im Bearbeitungsfenster angezeigt, wenn man versucht, Verzögerungen in einer Wiederholung unterzubringen, aber zumindest ich habe dies erst auf den geschätzt zehnten Bick festgestellt, und mich vorher sehr gewundert, warum in der Lua-Anzeige die Verzögerung überhaupt nicht realisiert ist.

1370300031_03VerzgerunginListegehtnicht.thumb.JPG.97c5daad0d8399363df75cec125a9fcb.JPG

Ich weiß nicht, ob es anderen möglicherweise schon ähnlich ergangen ist. Ich würde es jedenfalls als gut empfinden, wenn man auch in der Lua-Ansicht an jener Stelle, wo eigentlich die Umsetzung der Verzögerung erwartet wird, eine entsprechende Bemerkung, dass Verzögerungen hier nicht unterstützt werden, vorfinden würde.

Was ist eigentlich der Grund für diese fehlende Unterstützung?
Ein klassischer Anwendungsfall für die Realisierung unterschiedlicher Zeitverzögerungen bei einer Gruppe von gleichartig zu behandelnden Objekten ist die gleichzeitige Ausfahrbereitschaft mehrerer Züge in einem Bahnhof auf dieselbe Strecke. Werden diesen unterschiedliche Verzögerungswerte für die "Anforderung der Ausfahrt" zugewiesen, damit sich nicht alle zum selben Zeitpunkt um die Zuteilung der Ausfahrt "streiten", hat man genau die hier benötigte Konstellation von unterschiedlichen Zeitverzögerungen innerhalb einer "Wiederholung" für eine Gruppe von "Ausführungs-Kandidaten".

Ich habe das Problem nun so gelöst, dass in der Wiederholung "nur" ein benutzdefiniertes Ereignis angestoßen wird, welches mit den "Wiederholungs-Objekten" parametrisiert wird.

521723693_04BenutzerdefiniertesEreignismitParameter.thumb.JPG.2f9e3fa7322c02991d8dabeae3a2a87e.JPG

In diesem Ereignis erfolgt dann die Zeitverzögerung, deren unterschiedliche Werte bei den betroffenen Objekten als Objektvariable hinterlegt ist.

1021771660_05BenutzerdefiniertesEreignisAufruf.thumb.JPG.062b39d2ca7489787cd7f9ce4072232c.JPG

Die hier gezeigten EV-Beispiele sind in dem folgenden "Mini.Projekt" hinterlegt:

476823724_01Umschaltbeipiel.thumb.jpg.4645dafee9827b116a4072bb4badf670.jpg

Umschaltbeispiel.mbp

Beide Schalter in der Mitte schalten die seitlich angeordneten Drucktaster um, wobei jedem Taster eine eigene Verzögerungszeit als Objektvariable zugewiesen ist. Beim Einschalten werden jeweils die Drucktaster rechts, beim Ausschalten die Drucktaster links umgeschaltet. Mit dem oberen Schalter wird die erste (nicht funktionierende) Variante angestoßen. Hierbei werden immer alle betroffenen Taster sofort und zusammen umgeschaltet, weil ja keine Zeitverzögerung wirksam ist. mit dem unteren Schalter funktionieren die Zeitverzögerungen genau so, wie es beabsichtigt ist.


Noch eine Frage an @Neo:
Bei den realisierten Wiederholungs-Varianten handelt es sich ja durchweg um "FOR"-Schleifen. Wäre es möglich, auch eine Wiederholungsvariante als "WHILE"-Schleife zur Verfügung zu stellen, bei der man jede der heute bereits beim "IF"-Konstrukt auswählbaren Bedingungen einsetzen kann?

Besonders mit der Bedingung "Eigenschaft/Variable besitzt den Wert" wäre eine solche WHILE-Wiederholung sehr nützlich, um sich durch dynamische erzeugte Objektverkettungen (z.B. in Queues [= Warteschlangen])  durchhangeln zu können.

Viele Grüße
BahnLand

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 56 Minuten schrieb BahnLand:

Ein klassischer Anwendungsfall für die Realisierung unterschiedlicher Zeitverzögerungen bei einer Gruppe von gleichartig zu behandelnden Objekten ist die gleichzeitige Ausfahrbereitschaft mehrerer Züge in einem Bahnhof auf dieselbe Strecke

Hmmm - das ist für mein Empfinden keine gute Taktik.

Besser wäre, du würdest aus der Liste der wartenden Zügen einen auswählen und nur dem die Ausfahrt gewähren. Dann löscht du ihn aus der Liste. Erst, wenn der Streckenabschnitt wieder frei ist, darf ein weiterer Zug ausfahren. Den entnimmst du jetzt wieder der Liste und schmeißt dann auch dieses Element raus. Durch die Sortierung der Liste kannst du auch noch die Reihenfolge festlegen. Wer sich neu anmeldet kommt ans Ende der Liste. Und die Ausfahrt bekommt immer der Zug auf Platz 1.

 

Und so solltest du vielleicht immer verfahren, wenn du Wartezeiten einbauen willst:

Ohne Iteration über die Liste. Stattdessen immer ein Element verarbeiten und dann aus der Liste schmeißen. 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo BahnLand,

technisch funktionieren Verzögerungen so, dass ein Ereignis sofort gestoppt und nach Ablauf der Verzögerung wieder von vorn gestartet wird, wobei die bereits abgearbeiteten Aktionen übersprungen werden. Fügst du eine Verzögerung in einer Schleife ein, müsste das Ereignis nicht nur die abgearbeiteten Aktionen, sondern auch die bereits abgearbeiteten Iterationen überspringen. Das mag bei einer konstanten Liste noch funktionieren, aber nicht mehr bei einer While-Schleife, die ein dynamisches Abbruchkriterium besitzt. Das lässt sich technisch auch nicht mehr einfach realisieren.

Hinzu kommt, dass Iteration X + 1 erst verarbeitet wird, wenn die Verzögerung für die Iteration X abgelaufen ist. Wiederholungen sind jedoch dafür gedacht, eine Liste von Objekten gleich zu behandeln, d.h. die Aktionen sollen für alle Objekte sofort ausgeführt werden.

vor 4 Stunden schrieb BahnLand:

Ich würde es jedenfalls als gut empfinden, wenn man auch in der Lua-Ansicht an jener Stelle, wo eigentlich die Umsetzung der Verzögerung erwartet wird, eine entsprechende Bemerkung, dass Verzögerungen hier nicht unterstützt werden, vorfinden würde.

Das funktioniert leider nicht, da ein Skript erst ausgeführt werden müsste, um zu prüfen, ob eine Verzögerung auch aufgerufen wird. Hinter einem "defer"-Aufruf könnte ja auch eine benutzerdefinierte Funktion oder eine Tabelle oder irgendwas anderes stecken. Code-Analysen im Vorfeld sind bei Skriptsprachen nicht möglich.

vor 4 Stunden schrieb BahnLand:

Ich habe das Problem nun so gelöst, dass in der Wiederholung "nur" ein benutzdefiniertes Ereignis angestoßen wird, welches mit den "Wiederholungs-Objekten" parametrisiert wird.

Genau das ist auch der richtige Weg, Verzögerungen in Wiederholungen einzubauen. Denn nur damit umgehst du das oben beschriebene Problem, dass Iteration X + 1 erst nach Ablauf von Iteration X ausgeführt wird.

vor 4 Stunden schrieb BahnLand:

Wäre es möglich, auch eine Wiederholungsvariante als "WHILE"-Schleife zur Verfügung zu stellen, bei der man jede der heute bereits beim "IF"-Konstrukt auswählbaren Bedingungen einsetzen kann?

Technisch wäre das machbar, bisher habe ich darauf aber verzichtet, weil solche Konstrukte immer komplexer werden und ich die Annahme mache, dass die Leute in diesem Fall mit dem Wechsel auf Lua schneller ans Ziel kommen. Für dich wäre in diesem Fall eventuell die "Skript-Wiederholung" ein Kompromiss. Dort kannst du im Skript eine Tabelle generieren, die anschließend in der grafischen EV iteriert wird.

Viele Grüße,

Neo

Link zu diesem Kommentar
Auf anderen Seiten teilen

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto besitzen, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen.

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...