[Semaphore] Skript nur ausführen...

Fehler gibt es keine. Ich sehe nur im Log dass die Variable dreimal geupdated wurde eben der Anzahl der FHZs, doch sehe ich auch, dass das Skript auch soviele mal getriggert wurde und dessen Ausgangsvariable auch gesetzt, was natürlich zu Fehlinfos führt. Mit oder ohne IPS_Semaphore

Franz

Hallo Franz,

mit Wartezeit = 1 und IPS_Sleep(50) sollte es auf jeden Fall laufen. Am Skript ist sonst nichts ungewöhnliches zu erkennen.

Die eigentliche Trigger-Quelle ist eine Variable, die dreimal in sehr kurzer Zeit ein Update erfährt. Dabei ist es völlig ohne Bedeutung, ob der Grund hierfür von einer FHZ, einem 1-Wire Device oder sonst irgendeinem anderen Gerät ausgeht.

Mach bitte mal einen Versuch mit einem expliziten Text (z.B. „Besetzt!“) anstelle von $IPS_SELF. Möglicherweise ändert sich $IPS_SELF durch die „include“-Datei und wird daher nicht erkannt. Was das betrifft, könnte Fabian (prof) vielleicht Recht haben. Sollte das so sein, dann ist das allerdings ein Bug.

Gruß
HJH

@ HJH, Fabian:
Das Semaphor funktioniert wie von euch und paresy beschrieben wird.

@HJH:
Wegen der Probleme von Franz habe ich auch noch dein Sematest-Script getestet. Ich starte dein Sematest1-Script mit einer Taste der Tastatur (GlobalHotkey-Addin).
Dabei fiel mir auf, dass je nach Zeitpunkt nicht immer die nachfolgenden Aufrufe gesperrt werden. (das geht von 1 bis 3 erfolgreichen Durchläufen) :confused:

Deswegen habe ich noch zusätzlich folgenden Abschnitt eingebaut:

....
$x=Sys_GetCPUInfo();                            // neu
SetValueInteger("SemaTest_CPU",$x["CPU_AVG"]);  // neu
SetValueInteger("SemaTest_AnzahlDurchlaeufe", GetValueInteger("SemaTest_AnzahlDurchlaeufe") + 1);
IPS_Sleep(15);
IPS_SemaphoreLeave($IPS_SELF);
?>

… vielleicht ist ja der Windows-Task (Prozessorauslastung) dafür verantwortlich. Dachte ich jedenfalls. Hier ist aber die Prozessorauslastung und die Sleepdauer (getestet von 5 bis 50 ms) für die Verlängerung der Laufzeitdauer unerheblich. Die Wartezeit (1 ms) habe ich nicht verändert.


Zusatz 1:
Mit einem IPS_Sleep(110) funktioniert das aber schon ganz gut. Ich wählte den Wert nach mehreren Messungen mit microtime(). Die Differenzwerte (Ende-Beginn) halte ich in einer Float-Var fest.


Vielleicht kann das einer überprüfen.

Gruß
Günter.
(ein, inzwischen mit dem Semaphor Virus, angesteckter User) :slight_smile:

Hallo Günter,

microtime(…) und IPS_GetUpdateMicrotime(…) liefern leider keine zuverlässigen Ergebnisse. Dieses Phänomen (oder Bug) wurde von mir im Forum auch schon erwähnt und an Paresy gemeldet. Abweichungen von über 50s (!!!) sind leider nicht selten.

Ich benutze jetzt ebenfalls eine Taste um das Testskript zu starten. Seltsamerweise kann ich Dein Ergebnis nicht nachvollziehen. Ich habe es auf zwei verschiedenen Rechnern (700MHz und 3GHz) ausprobiert und komme immer zum selben Ergebnis: es funktioniert einwandfrei. Nur wenn die Laufzeit (Sleep) zu kurz ist (<10ms) kommen Mehrfach-Durchläufe vor.

Es lässt sich allerdings eine andere Merkwürdigkeit beobachten. Es ist nicht immer der erste Trigger, der das Skript startet. Der erste ist also nicht unbedingt der Schnellste. Es ist bekannt, dass die Reihenfolge immer etwas vom Zufall (und vom Betriebssystem) abhängig ist. Die Mehrfach-Trigger lassen sich damit aber auch nicht erklären.

Gruß
HJH

Hallo HJH,
das konnte ich auch feststellen. Nachdem ich glaube dass mein Rechner etwas langsam ist habe ich (probeweise) ungenützte Module entfernt. (RRD, WebInterface,…) Seitdem triggert bei mir der Erste. (mag Zufall sein)

Meine Umgebung: mit AMD Geode LX 500MHz bin ich ganz zufrieden. Habe im Normalbetrieb insgesamt ca. 660 Threads & 44 Prozesse laufen.
Meine Vermutung: bin vielleicht im Grenzbereich mit der Prozessorlast um das Semaphor verlässlich zu setzen

Gruß
Günter

Ich habe heute wieder damit experimentiert. => keine Änderung.

Dazu fiel mir folgende Möglichkeit ein:IPS_GetLastRun
Probleme:[ul]
[li]Leider liefert die Funktion keine Mikrosekunden (oder angenäherte Mikrosekunden).
[/li][li]Liefert die Funktion den Zeitstempel bei Aufruf oder bei Beendigung des Scriptes ?
[/li][li]UNIX-Timestamp stimmt nicht mit ScriptInfo Addin überein.
[/li]Das einfache Script:

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : NEW.ips.php
*/
echo date("H:i:s d.m.Y",IPS_GetLastRun($IPS_SELF));
?>

Im ScriptInfo-Addin wird der Zeitstempel aktualisert, die Ausgabe im Script-Fenster nicht!
[/ul]
@paresy:
Ist vielleicht ein Bug, wegen der Mikrosekunden ist es eine Anregung.
Kann die Funktion überhaupt einen Zeitstempel vom Script liefern in der sie verwendet wird?

Günter.