Hallo Rudi,
nochmal vielen Dank für die Umsetzung des Vorschlags aus Link (http://forum.fhem.de/index.php?topic=11840.0) (FinishFn mit undef wenn der Call gekillt wurde). Dieses funktioniert auch soweit.
Nun ist aber das Problem, dass ich ohne Device-Namen oder $hash-Referenz dieses undefiniertes Result keiner Definition zuordnen kann. In so einem Fall müssten sämtliche Funktionsaufrufe mit einer Referenz-Variable durchgeführt werden.
Als Beispiel:
BlockingCall($blockingFn, $arg, $finishFn, $timeout, $hash);
die FinishFn würde dann wie folgt aufgerufen: {$informFn($param, $hash)}
Wobei in einem solchen Fall keine Hash-Referenz verwendet werden kann, da diese nach dem Fork eine andere Speicheradresse besitzt.
Evtl. kann man hier noch eine Zwischenfunktion einfügen die den Devicenamen wieder in die Hash-Referenz umwandelt oder es darf nur ein String übergeben werden und die FinishFn/informFn muss die richtige Zuordnung selber durchführen.
Damit ist es möglich BlockingCall in Modulen zu verwenden die mehrfach definiert sein können.
Was meinst du dazu?
Viele Grüße
Markus
Dein Vorschlag hat das Problem, dass es nicht Rueckwaerts-Kompatibel ist. Wegen fork() / Adressraeumen muss man hier keine Sorgen machen: nach Ablauf der Timeout sollte das Kind niemanden mehr aufrufen.
Mein Vorschlag: 2 weitere optionale Argumente AbortFn,AbortArg:
sub TestBlocking() { BlockingCall("DoSleep", 5, "SleepDone", 8, "AbortFn", "AbortArg"); }
sub DoSleep($) { sleep(shift); return "I'm done"; }
sub SleepDone($) { Log 1, "SleepDone: " . shift; }
sub AbortFn($) { Log 1, "Aborted: " . shift; }
sub TestBlocking2() { BlockingCall("DoSleep", 5, "SleepDone", 2, "AbortFn", "AbortArg"); }
Das habe ich jetzt implementiert, kurz getestet und eingecheckt.
vielen Dank, Super Sache - wie immer
Gruß
Markus