Verständnisproblem bei Semaphore

Ja, wenn ein Script ‚tot‘ ist wird es rot dargestellt.

Die Frage ist warum werden es mehr ? Wer ist der Auslöser, also ‚SENDER‘ ?
Und welche Scripte sterben den tod durch die gesetzte Semaphore ?

Dies kannst du ja ganz simpel mal testen, indem du dies mitloggst.

if(!IPS_SemaphoreEnter("SR7007", 250 /* sehr kurz warten */)) {
IPS_LogMessage('TOT', 'Absender: '.$_IPS['SENDER']);
 return; //Läuft bereits
}
IPS_LogMessage('LÄUFT', 'Absender: '.$_IPS['SENDER']); 

Ich vermute mal das irgendwas dafür sorgt, dass das Script viel häufiger getriggert als es abgearbeitet werden kann bzw. weil die Semaphore sie ‚killt‘.

Einfach mal, wie ich es ja schon mal geschrieben hatte, die Semaphore nach der Aktion trennen.
z.B. so:

if(!IPS_SemaphoreEnter("SR7007".$_IPS['SENDER'], 250 /* sehr kurz warten */)) {
 return; //Läuft bereits
} 

// Ganz viel Code :)

//Aufräumen. Falls das Skript vorher stirbt, gibt es eine weitere Fehlermeldung, aber die Semaphore wird trotzdem aufgeräumt!
IPS_SemaphoreLeave("SR7007".$_IPS['SENDER']); 

Ich frage mich noch immer, ob du überhaupt eine/mehrere Semaphore(n) brauchst ?
Was für Probleme treten denn ohne auf ?
Den case-Block mit der RegisterVariable mit einer Semaphore abzusichern, kann ich ja noch nachvollziehen.
Aber die ganzen CSCK_SendText sollten sich eigentlich nie in die quere kommen.

Michael

Nein, in rot war das bisher nicht dargestellt. Den Sender mitzuloggen, kann ich mir sparen: Dieses eine Script ist ja das einzige Script, dass diese Semaphore benutzt.

Ja, genau so hatte ich das doch gemacht.

Ohne Semaphore treten eigentlich keine echten Probleme auf. Das Script läuft relativ brav, aber es kommt sich ab und zu mal selber in die Quere: Es wird ja zyklisch und durch Ereignisse und durch den Designer getriggert. Im Script entscheide ich, durch wen das Script aufgerufen wurde und führe dann dementsprechende Aktionen aus.

Gestört hatte mich, dass das Script dadurch natürlich auch mehrfach aufgerufen werden kann - das soll es aber nicht. Läuft also bereits gerade eine zyklische Abfrage und kommt währenddessen auch ein Ereignis rein, sollte das eben kurz warten.

Ich wollte also nur verhindern, dass das Script gleichzeitig mehrfach aufgerufen wird.

Der Tip im Forum war: Semaphore nutzen, das habe ich versucht.

Es ist ganz komisch:
Wenn ich die Semaphore so wie du geschrieben hast reinnehme, so läuft das tatsächlich wie erwartet: Kein mehrfacher aufruf, auch wenn „viel los ist“. Nach einigen Stunden bekomme ich die Semaphore aber nicht mehr weg und ich sehe in den Threads auch keinen Hänger. Ich kann auch nicht das Semaphore manuell löschen, indem ich den Leave-Befehl mal so aufrufe. Da bekommeich den Fehler, dass es nicht gesetzt ist. Setze ich es manuell, liefert der Enter den Rückgabewert „false“, aber ohne Fehlermeldung.

Wenn ch dann nur den Receiver aus und an mache, so geht das mit den Semaphore auch wieder. Der Receiver blockiert aber nichts, denn wenn ich statt dessen (Receiver bleibt an) die Sempahore rausnehme, so läuft das auch wieder.

Für mich siehts so aus, als ob der CSCK Befehl da irgendwie verhindert, dass das Semaphore aufgeräumt wird.

Nee, wie gesagt: Ich wollte nur unterbinden, dass das Script mehrfach aufgerufen wird bzw. beim Neuaufruf im Idealfall darauf wartet, dass der vorherige Thread fertig ist. Daher hatte ich das komplett gekapselt. Vielleicht ist das aber keine gute Idee in diesem Fall und ich mache das lieber mit einer Blockvar, wie das Chris beschrieben hat. Ich würde das nur gerne verstehen…

Du hast leider weder meine Idee mit dem Sender verstanden, noch dir den Code dazu genau angesehen.
Ich habe den Aufrufer des Script geloggt.
Weil wir doch wissen wollen wo es hängt :wink:

Ebenso habe ich den Semaphor verändert, damit nur noch ein Teil blockiert und du dann weißt welcher.

Wenn es jetzt ohne Anpassung blockiert, geht ja nix mehr. Weder Datenempfang, Timer noch Dashboard steuern.
Michael

Kann ich gerne mal machen, aber ich glaube, ich habe das schon verstanden:

Der Semaphore lautet dann je nach Aufruf „SR7007_TimerEvent“ oder „SR7007.Designer“ oder so.

Ich habe aber sehr häufig beobachtet, dass auch bei reinen TimerEvents die Sache klemmt. Ich sehe das ja immer sehr schön am Aktualisierungsdatum der Vars: Wenn der TimerEvent läuft, dann aktualisieren die sich brav alle paar Sekunden. Auch wenn ich nichts aus dem Designer benutze, klemmt es irgendwann.

Ich mache das aber jetzt mal trotzdem :wink:

[EDIT] … ein paar Stunden später.

Test ist durch, und ja: Es ist der Timerevent. Jetzt nimmt er aber trotzdem Befehle an, die ich über Ereignisse absetze. Danach geht auch das TimerEvent wieder. Also die Semaphore „SR7007_Timerevent“ klemmt. Ich kann es freisetzen, wenn z.B. danach die „SR7007-VARIABLE“ Semaphore verwendet wird.

Wie kommt das bloß, dass sich die Semaphore zum TimerEvent so festfrisst ?

kurzer Nachtrag, was mir gerade auffällt:

im Script passe ich ja den ScriptTimer und schiebe das Intervall rauf und runter, kann das damit zusammenhängen ?
Ist nur ein Gedanke … ich kanns ja mal rausnehmen …

Nachtrag:
Es ist wirklich der CSCK_SendText-Befehl. Wenn die Semaphore klemmt, reicht das alleinige Ausführen des CSCK_Sendtext, und die Semaphore ist schwuppsdiwupps wieder frei…

Hallo,

kann wir evtl. jemand weiterhelfen?

ich bekomme folgende Fehlermeldung:

Parse error: syntax error, unexpected ‚IPS_SemaphoreLeave‘ (T_STRING) in C:\IP-Symcon\scripts\52498.ips.php on line 11

wenn ich dieses Skript ausführe:

<?

if (IPS_SemaphoreEnter(„DSShutter“, 5000))
{
// …Kritische Befehle ausführen
$SetValue = GetValue(17604 /[Active Home\DS\dS Apartment\EG Wintergarten\EG Wintergarten Schatten\Links\PositionToBeSet]/);

DS_ShutterMove(34255 /*[Active Home\DS\dS Apartment\EG Wintergarten\EG Wintergarten Schatten\Links]*/, $SetValue);
  • //Semaphore wieder freigeben!
    IPS_SemaphoreLeave(„DSShutter“);
    }
    else
    {
    // …Keine ausführung Möglich. Ein anderes Skript nutzt den „DS_Shutter“
    // für länger als 5 Sekunde, sodass unsere Wartezeit überschritten wird.
    echo „Fehler“;
    }

?>

Lösche mal den * in Zeile 9

Vielen Dank.
Jetzt sehe ich das auch.
Im Editor war der irgendwie nicht zu sehen.

Hallo,

funktioniert IPS_SemaphoreEnter nur innerhalb eines Skriptes oder global auch über mehrere Skripte?
Mir scheint es als würde es nur lokal funktionieren.

Viele Grüße

Markus

Über alle Skripte.
Aber verlassen geht nur in dem Skript wo sie betreten wurde,sonst gibt es Fehlermeldungen.
Michael