[Problem] Individuelle random ID für einträge in einer Liste

Hallo zusammen,

Ich will in meinem Modul eine Liste einbauen, bei der ich für jeden Eintrag eine individuelle ID erstellen lasse.
Also, wenn der Nutzer einen Eintrag macht und dann auf Übernehmen klickt soll in der apply changes funktion eine ID für den neuen Eintrag gesetzt werden und in die Konfiguration geschrieben werden.

Bisher habe ich es mit
if(ID muss gesetzt werden) {
IPS_GetConfiguration
wert von ID Setzen
IPS_SetConfiguration
IPS_ApplyChanges
return
}
versucht, wobei ich eine endlosschleife vermieden habe.

Mit ein bis zwei Instanzen des Moduls eingebunden war das auch kein problem, aber wenn es zu viele Instanzen werden kommen die unterschiedlichsten Fehler.
Hier mal ein paar:
TimerPool: warte auf beendigung des timer threads.
kompletter absturz und keine nachricht im Log.
löschen vieler unabhängiger objekte (fast alle) sowie Kern Instanzen.

Das ganze passiert, wenn man das Modul Updated oder neu einbindet.
Da bei beiden Aktionen die apply changes funktion ausgeführt, vermute ich, dass IPS mit so vielen gleichzeitigen skripts nicht klar kommt.

Habt ihr eine Idee wie sich das alles einfacher gestallten oder lösen lässt?

Das ist bisher die einzige „Lösung“. Jedoch vermute ich, dass bei dir in irgendeiner Konstellation wohl doch eine Endlosschleife entsteht. Du kannst dir unter PHP-Informationen ja mal alle PHP Threads ansehen.

paresy

Ich bezweifle, dass eine Endlosschleife entsteht, da es ja mit einigen wenigen Instanzen funktioniert.
als die Meldung „TimerPool: warte auf beendigung des timer threads.“ kam war in der PHP Information auch nicht viel von meinem Modul zu sehen (nur ein paar andere skripts hier und da die nichts mit dem Modul zu tun haben). Nur die TimerPool Message kam durchgehend in den Meldungen vor (alle 1s). Und beim Neustarten waren die Meisten meiner Objekte gelöscht sowie Kerninstanzen.

Das ist schwierig zu beurteilen wenn man nicht das Skript bzw. den Code vor sich hat. Um wieviele Instanzen handelt es ich denn da, nutzt Du so was wie Semaphore um das bei einer Instanz nach der anderen abzuarbeiten?

Semapore hatte ich nicht aktiv.
Das ganze Skript, das den fehler verursacht hat gibts hier.
Diese Ausschnitte sind für die reiteration zuständig:

$dataString = $this->ReadPropertyString("Names"); (Zeile 93)
		//check if the Table String is empty
		if($dataString != "")
		{
			$data = json_decode($dataString, true);
			//make sure the Content of the Table is valid
			if(sizeof($data) > 0)
			{
				//check if it's currently reiterating the apply changes process
				if($this->status != 'reiterating')
				{
					(erstellen von objekten... Zeile 104)

$reiterate = false; (Zeile 333)
					foreach($data as $i => $entry)
					{
						//check if any positions were set
						if(array_key_exists('Position', $entry))
						{
							if($entry['Position'] == 0)
							{
								$data[$i]['Position'] = $i;
								$reiterate = true;
								$this->SetStatus('reiterating');
							}
						}
						//check if a Valid ID is set to this entry
						if(array_key_exists('ID', $entry))
						{
							if($entry['ID'] == 0 || $entry['ID'] == null)
							{
								//Set a new ID in case no ID was set
								$data[$i]['ID'] = rand(10000, 99999);
								//tell the rest of the script to reload down the line with the new IDs
								$reiterate = true;
								$this->SetStatus('reiterating');
							}
						}
					}
					//reiterate the Modules apply changes function with the newly added IDs
					if($reiterate)
					{
						$configModule = json_decode(IPS_GetConfiguration($this->InstanceID), true);
						$configModule['Names'] = json_encode($data);
						$configJSON = json_encode($configModule);
						IPS_SetConfiguration($this->InstanceID, $configJSON);
						IPS_ApplyChanges($this->InstanceID);
						return;
					}
				}
				$this->SetStatus('runnung'); (Zeile 372)

$this->SetStatus schreibt den momentanen Status in eine Textdatei. in der __construct funktion wird $this->status auf den in der textdatei gesetzten wert gesetzt.

und Instanzen waren es 13 stück