SYNOPSIS
void call_out(string fun, int delay, mixed arg, ...)
void call_out(closure cl, int delay, mixed arg, ...)
BESCHREIBUNG
Ruft zeitverzoegert die Funktion <fun> im aktuellen Objekt oder
die Closure <cl> auf. Der Aufruf erfolgt in <delay> Sekunden.
Die Funktion / Closure wird mit den <arg> Argumenten aufgerufen.
Die minimale Verzoegerung ist 0 (negative <delay> werden implizit als
0 behandelt). Allerdings ist die reale Verzoegerung etwas zwischen
<delay> und __ALARM_TIME__.
call_out() merkt sich den aktuellen User und ruft die Funktion
entsprechend auf. call_out() kann nur Funktionen aufrufen, die
oeffentlich zugaenglich sind, das heisst "public" und "static"
deklarierte Funtionen. "private" und "protected" deklarierte
Funktionen koennen nicht aufgerufen werden.
Die Ausfuehrung von call_out()s erfordert einen einfachen (nicht
zu aufwendigen) Schutz gegen Rabbits: die Evalkosten aller
gleichzeitig anstehenden call_out()s werden auf einer pro-UID-Basis
summiert. Uebersteigt die Summe ein vorgegebenes Maximum, wird
ein Fehler 'too long evaluation' erzeugt, und es werden alle
call_out()s des betreffenden Benutzers, die zur gleichen Zeit
faellig werden, entfernt.
Wenn zwei call_out()s zum gleichen Zeitpunkt ausgefuehrt werden
sollen, wird der zuerst gestartete zuerst ausgefuehrt.
BEISPIELE
call_out("RefreshMe", 10);
Dies ruft die Funktion RefreshMe() nach Ablauf von 10 Sekunden ohne
irgendwelche Argumente auf. Die Funktion RefresMe() kann dann
wiederum selbst call_out()s starten, auch auf sich selbst, was
eine Schleife erzeugt (keine Rekursion). Mit einer solchen Schleife
koennen Anweisungen in einem Objekt in regelmaessigen Zeitintervallen
ausgefuehrt werden. Es ist allerdings zu beachten, dass call_out()s
in einer linearen Liste gespeichert werden, und deshalb ziemlich
rechenaufwendig fuer den Treiber sind.
Und JA: selbst-replizierende call_out()s, bei denen jeder call_out()
selbst zwei oder mehr call_out()s in einem Loop erzeugt (sogenannte
Rabbits) verlangsamen das Mud ungemein und koennen es sogar zum
Crash bringen. Kein Grund, es selbst auszuprobieren.
SIEHE AUCH
remove_call_out(E), call_out_info(E), find_call_out(E),
this_player(E), reset(A), heart_beat(A)
|