Endlosschleife
Eine Endlosschleifen ist eine Folge von Aktionen oder Auslösern, die nie mehr verlassen werden kann. Das kann der Fall sein, wenn in einer Schleife die Austrittsbedingung niemals erfüllt sein kann. Eine Schleife ist aber nicht immer notwendig. So kann ein Auslöser sein eigenes Ereignis auslösen, oder sich direkt oder auf dem Umweg über einen weiteren Trigger selbst aufrufen.
Die Folgen von Endlosschleifen sind unterschiedlich. Manche Endlosschleifen sind gutartig, also vom Mapper gewollt. Diese Endlosschleifen enthalten Waits, so dass die Aktionen der Schleife in einer bestimmten Geschwindigkeit abgearbeitet werden können. Am einfachsten geht das über ein Periodisches Ereignis. In der Regel sind sie aber ein Bug.
Wenn eine Endlosschleife kein Wait enthält, dann muss der Computer in einem einzigen Moment unendlich viele Aktionen abarbeiten. Da das nicht möglich ist, bricht der Auslöser irgendwann aufgrund der maximalen Ausführungszeit ab. Dies merkt man daran, dass ein Trigger nicht zu Ende läuft, und nur bis zu einem bestimmten Punkt, die Aktionen ausführt, die er enthält. Liegen synchronisierte Aktionen innerhalb der Endlosschleife, stürzt der Rechner meistens trotzdem ab, da die Maximale Ausführungszeit es z.B. zulässt, tausende Einheiten zu erstellen, was den Computer natürlich überfordert. Grade bei gegenseitigen oder rekursiven Tiggeraufrufen ohne Waits, wirkt die Maximale Ausführungszeit überhaupt nicht, und das Spiel stürzt mit einem Fatal-Error ab oder friert ein.
Inhaltsverzeichnis |
Mögliche Folgen
Eine Endlosschleife kann im Spiel verschiedene Auswirkungen haben:
- Die Maximale Ausführungszeit wird erreicht und der Trigger beendet seine Ausführung ergebnislos.
- Warcraft stürzt mit einem Fatal-Error ab.
- Warcraft hängt sich komplett auf und blockiert den PC.
Leider werden alle Auslöser mit sehr vielen Aktionen irgendwann als Endlosschleifen erkannt und abgebrochen, auch wenn sie zu Ende laufen würden. Der Artikel Maximale Ausführungszeit erläutert das Problem genauer.
Arten
Es gibt sehr viele verschiedene Möglichkeiten, Endlosschleifen hervorzurufen. Grob unterscheidet man Schleifen, deren Austrittsbedingung nicht erfüllt werden kann und schleifenartige Rekursion unter Auslösern.
Normale Endlosschleife
Endlosschleife
For each I from 1 to 2 do (Actions)

Set I = 1Diese Schleife endet nie, da der Endwert 2 nie erreicht wird.
loop call DisplayTimedTextToForce(GetPlayersAll(), "Haha, you suck") exitwhen false endloop
Dieser Jasscode würde so oft den String ausgeben, bis er durch die maximale Ausführungszeit abgebrochen wird.
Rekursive Auslöser
Endlosschleife
Ereignisse

Zeit - Elapsed Game Time is 5.00 seconds
Bedingungen
Aktionen

Auslöser - Run (This Trigger) (ignoring conditions)Dieser Auslöser enthält zunächst keine sichtbare Schleife. Allerdings hat der Selbstaufruf den gleichen Effekt, und sorgt dafür, dass der Auslöser sich selbst unendlich oft aufruft.
