Ich brauche bitte einen Schubs in die richtige Richtung

Begonnen von betateilchen, 11 Oktober 2015, 22:30:03

Vorheriges Thema - Nächstes Thema

betateilchen

Hallo Entwicklerkollegen,

ich experimentiere grade mit Blocking.pm und stehe vor einer Aufgabe, zu der ich seit zwei Stunden keine Lösung finde.


  • Funktion wird per BlockingCall($funktionsName,$hash,$finishFn,60) aufgerufen.
  • $funktionsName liefert als Ergebnis einen %ergebnisHash
  • Wie muss ich das Ergebnis aus $funktionsName zurückgeben und wie muss $finishFn dieses Ergebnis übernehmen, damit ich damit weiterarbeiten kann?

Bestimmt sehe ich einfach mal wieder vor lauter Bäumen den Wald nicht :(

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

hexenmeister

Hash aul Return-Wert dürfte das Problem sein. Die Rückgabe wird doch serialisiert, also muss das ein String sein. Im SYSMON habe ich genau so gemacht, alles mit einem Trennzeichen in ein String und dann in finishFn wieder auseinandernhmen.

betateilchen

Die Idee hatte ich auch schon. Aber irgendwie habe ich das Bauchgefühl, dass das auch einfacher gehen muss. Bestimmt irgendwie über Referenzen oder so, aber damit stehe ich auf Kriegsfuß.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

hexenmeister

Sag Bescheid, wenn Du eine bessere Idee findest. Glaube aber eher nicht daran, da zwischen zwei getrennten Prozessen keine Referenzen funktionieren werden (ok, theoretisch wäre SharedMemory & Co. schon denkbar).

justme1968

es geht leider nicht wirklich einfacher. die rückgabe muss ein einzeiliger string sein. d.h. er darf keine zeilenumbrüche enthalten. die einschränkung kommt daher das die rückgabe durch telnet muss.

wenn du nicht selber serialisieren willst funktioniert es mit encode_json gut. auf der anderen seite dann mit decode_json wieder auspacken.

wichtig ist das du nich den namen des devices das BlockingCall aufgerufen hat aus  $funktionsName wieder mit zurück an $finishFn zurück gibst. das geht nicht automatisch.

statt Blocking.pm kannst du dir auch SubProcess.pm anschauen. da die kommunikation hier per direkt per socket erfolgt fällt die einschränkung mit den zeilenumbrücken weg und du musst auch keinen device namen zurück geben. serialisieren musst du aber immer noch.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

betateilchen

Danke für die Erklärungen.

Habe mein "Problem" nun wie vorgeschlagen mit einem ziemlich langen String als Rückgabewert gelöst.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!