Präzisierung Semaphore erbeten

Hallo

Zwei Fragen zu Semaphore:

1
Wird (bei besetzter Semaphore) die erneute Ausführung um die Zeit ‚Wartezeit‘ ausgesetzt (d.h. neuer Versuch erst nach Ablauf der Zeit) oder wird die Ausführung laufend versucht und erst abgebrochen wenn die Wartezeit überschritten ist?
In der Doku steht unter ‚Parameterliste‘ Variante 1 und unter ‚Beschreibung‘ Variante 2.
Hat eine wichtige Bedeutung für mich, ob die Wartezeit garantiert verstreicht oder ob bei schnellerer Freigabe der Sempahore das Skript sofort erneut durchläuft.

2
Wird ein Skript als ‚fehlerhaft‘ markiert, wenn die Wartezeit überschritten wird? Ist bei mir so (wenn ich nicht sonst etwas falsch mache) und da verstehe ich die Logik nicht ganz. Ist ja kein fehlerhaftes Skript sondern ein Teil einer if-Abfrage wurde einfach nicht ausgeführt?

Danke für Erhellung, kjb

Du hat Recht. Das ist falsch beschrieben! Werde ich korrigieren.

Es wird max. die Zeit gewartet. Aber sofort abgearbeitet, wenn ein anderen Skript die Semaphore frei gibt.
Es sollte nicht fehlerhaft meldet werden, sofern du die Semaphore korrekt frei gibt, und das Skript nicht z.B. mit exit beendest.

paresy

Danke, dann verstehe ich, was bei mir nicht passt.

Habe ausserdem nicht bedacht, dass das Script mit der maximalen Wartezeit den Timeout überschreitet, deshalb ‚fehlerhaftes Script‘. War also mein Fehler.

Gibt es eine IPS-interne Möglichkeit ein Script so zu begrenzen, dass es nur maximal alle x Sekunden/Minuten ausgeführt werden kann oder muss ich mir das selbst limitieren?

LG, kjb

Das müsstest du selber machen mit z.B. einer Hilfsvariable.

paresy

ok, danke.

Hi!

Du kannst das entweder mit einer Hilfsvariable machen, welche durch z.B. einen Timer dann nach X Sekunden/Minuten das Skript wieder frei gibt, oder du machst es z.B. so:

<?
$LetzterSkriptStart = Round((time() - IPS_GetScript($_IPS['SELF'])['LastExecute']));
echo "Letzte Skript-Ausführung war vor ".$LetzterSkriptStart." Sekunden

";

if ($LetzterSkriptStart > 30) {
	// Dieser Teil wird nur aufgerufen, wenn der letzte Skript-Start länger als 30 Sekunden her ist
	echo "Der letzte Skript-Start liegt länger als 30 Sekunden zurück";
}
?>

Unter Raspberry/Linux/Mac musst du statt „LastExecute“ was anderes nehmen (IP-Symcon Community Forum)

Und so kannst du die Infos zu einem Skript allgemein auslesen:

<?
// Was steht alles in den Script-Infos?
$Werte = IPS_GetScript($_IPS['SELF']);
print_r($Werte);
?>

Grüße,
Chris

Deutlich eleganter als meine Version mit Hilfsvariable.

Danke für den Tipp.

…und dann doch noch eine Frage aus Interesse: Warum ‚Round‘ (Timestamps sind doch ganzzahlige Sekundenwerte) und warum doppelte Klammern? Da kenn ich evt. einige PHP-Tricks nicht.

Danke und Gruss, kjb

„round“ kann in diesem Fall auch weggelassen werden. Rechnest du aber z.B. auf Minuten um, dann könntest du es wieder brauchen. Alles eine Frage der Anforderung :slight_smile:

Und die Klammern müssen so sein, weil sonst funktioniert es nicht :smiley: Sind ja mehrere Befehle in eine Zeile vereint. Kannst es dir ja mal „aufdröseln“, dann siehst du warum das so ist :wink: Doof zu erklären :slight_smile:

Erst wird das ausgelesen >> IPS_GetScript($_IPS[‚SELF‘])
Und von dem Ergebnis dann >> [‚LastExecute‘]
usw… :slight_smile:

Grüße,
Chris

Na immerhin hab ich dann keine PHP-Tricks verpasst :slight_smile:

‚Round‘ ist dann auch mir klar und ich glaube immer noch, dass es ein Klammerpaar nicht braucht aber ich will jetzt nicht so wirken wie es wirkt :smiley: und deshalb nochmals herzlichen Dank für den Anstoss zu meiner jetzt wirklich viel eleganteren neuen Variante in meinen Skripts:

if (time() - IPS_GetScript($_IPS['SELF'])['LastExecute'] < 10) return;

Am Anfang eingefügt, wird das Skript frühestens nach 10 Sekunden erneut ausgeführt, ganz ohne Hilfsvariablen.

Gruss, kjb

Hehe, gerne! Und keine Sorge, ich beschäftige mich erst seit rund einem halben Jahr mit IPS/PHP, also passieren mir dauernd Fehler :smiley:

Aber probier es doch einfach mal aus, mach die, deiner Meinung nach überflüssigen, Klammern weg und du wirst merken, dass die Klammern ihren Sinn haben :wink:

Grüße,
Chris

Also das Original läuft natürlich:

$LetzterSkriptStart = Round((time() - IPS_GetScript($_IPS['SELF'])['LastExecute'])); 

und das aber genauso:

$LetzterSkriptStart = Round(time() - IPS_GetScript($_IPS['SELF'])['LastExecute']);

Oder ich kapiers immer noch nicht (das ist ja das was mich wurmt hier) :confused:

:smiley: :smiley: :smiley:

Ich dachte die ganze Zeit, dass du die Klammern um IPS-SELF meinst :smiley: Ja, alles gut, deine Variante wäre die „richtigere“ :smiley:

Grüße,
Chris

Ach so, Klassiker :cool: Ich bin froh, dass ich so weitermachen kann wie bisher. Mag das Gefühl nicht, was gar nicht zu begreifen :wink:

Hallo zusammen
Zu beachten ist allerdings das wenn das Skript sagen wir mal alle 5s aufgerufen wird und das hier drin ist

if (time() - IPS_GetScript($_IPS[‚SELF‘])[‚LastExecute‘] < 10) return;

wird das restliche nach return beim ersten Aufruf ausgeführt und dann erst wieder wenn einmal mehr als 10s zwischen zwei aufrufen vergangen sind.
Es wird ja „nur“ überprüft ob das Skript aufgerufen wurde und nicht ob es auch komplett abgearbeitet wurde.
Könnte also sein das das Skript nach dem return erst sehr viel später als die gewünschten 10s stattfindet.
Kommt natürlich auf den speziellen Fall darauf an ob man es so machen kann oder leider doch eine Hilfsvariable braucht.

Ich hab beide Varianten im Gebrauch, je nachdem was gerade passt.

Gruß Jannis

Ja, ein wichtiger Hinweis. In meinem Fall genau das richtige Verhalten aber je nach Anwendung kann es tückisch sein und im Extremfall wird der eigentliche Script-Inhalt gar nie mehr ausgeführt, wenn das Skript immer in kurzen Intervallen getriggert wird.