blob: 0293b3ed5b5b53c41bb1f01940ab94cb122b6694 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001SYNOPSIS
2 void call_out(string fun, int delay, mixed arg, ...)
3 void call_out(closure cl, int delay, mixed arg, ...)
4
Zesstrab6ac9f62020-01-21 11:11:16 +01005BESCHREIBUNG
6 Ruft zeitverzoegert die Funktion <fun> im aktuellen Objekt oder
7 die Closure <cl> auf. Der Aufruf erfolgt in <delay> Sekunden.
8 Die Funktion / Closure wird mit den <arg> Argumenten aufgerufen.
9 Die minimale Verzoegerung ist 0 (negative <delay> werden implizit als
10 0 behandelt). Allerdings ist die reale Verzoegerung etwas zwischen
11 <delay> und __ALARM_TIME__.
MG Mud User88f12472016-06-24 23:31:02 +020012
Zesstrab6ac9f62020-01-21 11:11:16 +010013 call_out() merkt sich den aktuellen User und ruft die Funktion
14 entsprechend auf. call_out() kann nur Funktionen aufrufen, die
15 oeffentlich zugaenglich sind, das heisst "public" und "static"
16 deklarierte Funtionen. "private" und "protected" deklarierte
17 Funktionen koennen nicht aufgerufen werden.
MG Mud User88f12472016-06-24 23:31:02 +020018
Zesstrab6ac9f62020-01-21 11:11:16 +010019 Die Ausfuehrung von call_out()s erfordert einen einfachen (nicht
20 zu aufwendigen) Schutz gegen Rabbits: die Evalkosten aller
21 gleichzeitig anstehenden call_out()s werden auf einer pro-UID-Basis
22 summiert. Uebersteigt die Summe ein vorgegebenes Maximum, wird
23 ein Fehler 'too long evaluation' erzeugt, und es werden alle
24 call_out()s des betreffenden Benutzers, die zur gleichen Zeit
25 faellig werden, entfernt.
MG Mud User88f12472016-06-24 23:31:02 +020026
Zesstrab6ac9f62020-01-21 11:11:16 +010027 Wenn zwei call_out()s zum gleichen Zeitpunkt ausgefuehrt werden
28 sollen, wird der zuerst gestartete zuerst ausgefuehrt.
MG Mud User88f12472016-06-24 23:31:02 +020029
Zesstrab6ac9f62020-01-21 11:11:16 +010030BEISPIELE
MG Mud User88f12472016-06-24 23:31:02 +020031 call_out("RefreshMe", 10);
32
Zesstrab6ac9f62020-01-21 11:11:16 +010033 Dies ruft die Funktion RefreshMe() nach Ablauf von 10 Sekunden ohne
34 irgendwelche Argumente auf. Die Funktion RefresMe() kann dann
35 wiederum selbst call_out()s starten, auch auf sich selbst, was
36 eine Schleife erzeugt (keine Rekursion). Mit einer solchen Schleife
37 koennen Anweisungen in einem Objekt in regelmaessigen Zeitintervallen
38 ausgefuehrt werden. Es ist allerdings zu beachten, dass call_out()s
39 in einer linearen Liste gespeichert werden, und deshalb ziemlich
40 rechenaufwendig fuer den Treiber sind.
MG Mud User88f12472016-06-24 23:31:02 +020041
Zesstrab6ac9f62020-01-21 11:11:16 +010042 Und JA: selbst-replizierende call_out()s, bei denen jeder call_out()
43 selbst zwei oder mehr call_out()s in einem Loop erzeugt (sogenannte
44 Rabbits) verlangsamen das Mud ungemein und koennen es sogar zum
45 Crash bringen. Kein Grund, es selbst auszuprobieren.
MG Mud User88f12472016-06-24 23:31:02 +020046
Zesstrab6ac9f62020-01-21 11:11:16 +010047SIEHE AUCH
MG Mud User88f12472016-06-24 23:31:02 +020048 remove_call_out(E), call_out_info(E), find_call_out(E),
49 this_player(E), reset(A), heart_beat(A)