Semaphore, Fehlermeldung Registervariable

Durch was könnte denn folgende Warnmeldung hervorgerufen werden ?


17.12.2011 00:02:20.235 | 45880 | MESSAGE | RegisterVariable | Warning: Semaphore ‚29439‘ was not released!
17.12.2011 00:02:20.350 | 45880 | MESSAGE | RegisterVariable | Warning: Semaphore ‚29439‘ was not released!
17.12.2011 00:02:20.375 | 45880 | MESSAGE | RegisterVariable | Warning: Semaphore ‚29439‘ was not released!

Script 45880:

<?
$buf = RegVar_GetBuffer(50551 /[ZK-Heiz\Zk-Wmz\Zk_Wmz_RegisterVar]/); //Puffer einlesen
if ($IPS_SENDER == „RegisterVariable“)
$buf .= $IPS_VALUE; // neuen Wert hinzufügen
RegVar_SetBuffer(50551 /[ZK-Heiz\Zk-Wmz\Zk_Wmz_RegisterVar]/,$buf);
?>

Script 29439 (wird zyklisch jede Sekunde aufgerufen):

<?
// Mehrfachaufruf mit Semaphore verhindern
if (!IPS_SemaphoreEnter($IPS_SELF, 1)) { //Falls Semaphore noch gesetzt 1ms warten dann über return verlassen
IPSLogger_Wrn(file, ‚Zk_SekTimer Semaphore noch nicht abgelaufen‘);
return;
}
SetValue(13177 /[ZK-Heiz\Zk-Ablaufsteuerung\Zk_SekTimer_laeuft]/, True);

//Semaphore freigeben
IPS_SemaphoreLeave($IPS_SELF);
SetValue(13177 /[ZK-Heiz\Zk-Ablaufsteuerung\Zk_SekTimer_laeuft]/, False);
?>

Gruß
Zk

Kannst Du den sicherstellen, dass das Script zwischen IPS_SemaphoreEnter und IPS_SemaphoreLeave nicht durch ein Exit oder eventuell einen Fehler verlassen wird - poste doch mal das komplette Script

Das ist etwas kompliziert:

$Log = false;
$time_start = microtime(true);

Include_once ‚IPSLogger.ips.php‘;
//IPSLogger_Tst(file, ‚Start Zk_SekTimer‘);

// Mehrfachaufruf mit Semaphore verhindern
if (!IPS_SemaphoreEnter($IPS_SELF, 1)) { //Falls Semaphore noch gesetzt 1ms warten dann über return verlassen
IPSLogger_Wrn(file, ‚Zk_SekTimer Semaphore noch nicht abgelaufen‘);
return;
}
SetValue(13177 /[ZK-Heiz\Zk-Ablaufsteuerung\Zk_SekTimer_laeuft]/, True);

if (in_array($SekTimer_Zaehler,array(6))) {
//IPSLogger_Tst(file, '$SekTimer_Zaehler = '.$SekTimer_Zaehler);
//IPS_RunScript(46080 /[ZK-Heiz\Zk-Wmz\Zk_Wmz_lesen]/);
}
if (in_array($SekTimer_Zaehler,array(2, 7, 12, 17, 22, 27, 32, 37, 42, 47, 52, 57))) {
//IPSLogger_Tst(file, '$SekTimer_Zaehler = '.$SekTimer_Zaehler);
echo IPS_RunScriptWait(13307 /[ZK-Heiz\ZK-Micro01\Zk_Micro_Errorbearbeitung]/);
echo IPS_RunScriptWait(37468 /[ZK-Heiz\ZK-Wetter\Zk_Wetter_lesen]/);
echo IPS_RunScriptWait(21136 /[ZK-Heiz\Zk-HomeMatic\Zk-HomeMatic_lesen]/);
}
if (in_array($SekTimer_Zaehler,array(4, 14, 24, 34, 44, 54))) {
//IPSLogger_Tst(file, '$SekTimer_Zaehler = '.$SekTimer_Zaehler);
IPS_RunScript(42849 /[ZK-Heiz\Zk-PelletKessel\Zk_PelletKessel_Lesen]/);
}
if (in_array($SekTimer_Zaehler,array(13, 25))) {
//IPSLogger_Tst(file, '$SekTimer_Zaehler = '.$SekTimer_Zaehler);
IPS_RunScript(25243 /[ZK-Heiz\Zk-CUNO\Zk-CUNO_lesen]/);
}

//Semaphore freigeben
IPS_SemaphoreLeave($IPS_SELF);
SetValue(13177 /[ZK-Heiz\Zk-Ablaufsteuerung\Zk_SekTimer_laeuft]/, False);

Das Script wird wie gesagt jede Sekunde aufgerufen, in dem Script wird dann ein Sekundenzähler von 1 bis 60 hochgezählt um dann je nach Zählerstand unterschiedlichste Scripte mit „IPS_RunScriptWait“ oder " IPS_RunScript" aufzurufen.
So eine Art Taktverteiler.
In den diversen Scripten könnten dann natürlich evtl. schon Fehler auftreten, protokolliert werden aber keine weiteren Fehlermeldungen.

Im Verdacht habe ich den Zugrifft auf eine zentrale mySQL-Datenbank, da mir dort nicht genau klar ist wie die Datenbank bei Aufruf aus mehreren Scripten optimal (evtl. resourecenschonend) zu öffnen und zu schließen ist. Z.B. werden in der mySQL-Datenbank auch Einträge des IPS-Loggers protokolliert.

Gruß
zkra

Ich habs mal in PHP-Tags gesetzt. Ist einfach besser lesbar.

$Log = false;
$time_start = microtime(true);

Include_once 'IPSLogger.ips.php';
//IPSLogger_Tst(__file__, 'Start Zk_SekTimer');

// Mehrfachaufruf mit Semaphore verhindern
if (!IPS_SemaphoreEnter($IPS_SELF, 1)) { //Falls Semaphore noch gesetzt 1ms warten dann über return verlassen
IPSLogger_Wrn(__file__, 'Zk_SekTimer Semaphore noch nicht abgelaufen');
return;
}
SetValue(13177 /*[ZK-Heiz\Zk-Ablaufsteuerung\Zk_SekTimer_laeuft]*/, True);

....

if (in_array($SekTimer_Zaehler,array(6))) {
//IPSLogger_Tst(__file__, '$SekTimer_Zaehler = '.$SekTimer_Zaehler);
//IPS_RunScript(46080 /*[ZK-Heiz\Zk-Wmz\Zk_Wmz_lesen]*/);
}
if (in_array($SekTimer_Zaehler,array(2, 7, 12, 17, 22, 27, 32, 37, 42, 47, 52, 57))) {
//IPSLogger_Tst(__file__, '$SekTimer_Zaehler = '.$SekTimer_Zaehler);
echo IPS_RunScriptWait(13307 /*[ZK-Heiz\ZK-Micro01\Zk_Micro_Errorbearbeitung]*/);
echo IPS_RunScriptWait(37468 /*[ZK-Heiz\ZK-Wetter\Zk_Wetter_lesen]*/);
echo IPS_RunScriptWait(21136 /*[ZK-Heiz\Zk-HomeMatic\Zk-HomeMatic_lesen]*/);
}
if (in_array($SekTimer_Zaehler,array(4, 14, 24, 34, 44, 54))) {
//IPSLogger_Tst(__file__, '$SekTimer_Zaehler = '.$SekTimer_Zaehler);
IPS_RunScript(42849 /*[ZK-Heiz\Zk-PelletKessel\Zk_PelletKessel_Lesen]*/);
}
if (in_array($SekTimer_Zaehler,array(13, 25))) {
//IPSLogger_Tst(__file__, '$SekTimer_Zaehler = '.$SekTimer_Zaehler);
IPS_RunScript(25243 /*[ZK-Heiz\Zk-CUNO\Zk-CUNO_lesen]*/);
}
....


//Semaphore freigeben
IPS_SemaphoreLeave($IPS_SELF);
SetValue(13177 /*[ZK-Heiz\Zk-Ablaufsteuerung\Zk_SekTimer_laeuft]*/, False); 

Update mal auf die Beta. tsgusi hatte diesbezüglich einen Fehler gefunden gehabt. Der ist in der 2.5er Beta behoben.

paresy