MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 1 | SYNOPSIS |
| 2 | void call_out(string fun, int delay, mixed arg, ...) |
| 3 | void call_out(closure cl, int delay, mixed arg, ...) |
| 4 | |
Zesstra | b6ac9f6 | 2020-01-21 11:11:16 +0100 | [diff] [blame] | 5 | BESCHREIBUNG |
| 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 12 | |
Zesstra | b6ac9f6 | 2020-01-21 11:11:16 +0100 | [diff] [blame] | 13 | 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 18 | |
Zesstra | b6ac9f6 | 2020-01-21 11:11:16 +0100 | [diff] [blame] | 19 | 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 26 | |
Zesstra | b6ac9f6 | 2020-01-21 11:11:16 +0100 | [diff] [blame] | 27 | Wenn zwei call_out()s zum gleichen Zeitpunkt ausgefuehrt werden |
| 28 | sollen, wird der zuerst gestartete zuerst ausgefuehrt. |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 29 | |
Zesstra | b6ac9f6 | 2020-01-21 11:11:16 +0100 | [diff] [blame] | 30 | BEISPIELE |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 31 | call_out("RefreshMe", 10); |
| 32 | |
Zesstra | b6ac9f6 | 2020-01-21 11:11:16 +0100 | [diff] [blame] | 33 | 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 41 | |
Zesstra | b6ac9f6 | 2020-01-21 11:11:16 +0100 | [diff] [blame] | 42 | 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 46 | |
Zesstra | b6ac9f6 | 2020-01-21 11:11:16 +0100 | [diff] [blame] | 47 | SIEHE AUCH |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 48 | remove_call_out(E), call_out_info(E), find_call_out(E), |
| 49 | this_player(E), reset(A), heart_beat(A) |