FHEM Forum

FHEM - Entwicklung => FHEM Development => Thema gestartet von: Markus Bloch am 08 April 2013, 17:06:26

Titel: BlockingCall() mit $hash-Referenz
Beitrag von: Markus Bloch am 08 April 2013, 17:06:26
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

Titel: Aw: BlockingCall() mit $hash-Referenz
Beitrag von: rudolfkoenig am 08 April 2013, 17:55:41
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.
Titel: Aw: BlockingCall() mit $hash-Referenz
Beitrag von: Markus Bloch am 08 April 2013, 18:04:31
vielen Dank, Super Sache - wie immer

Gruß
Markus