Weiss Script um Therad-Nummer??

Ich bin gerade dabei eine etwas trickreichere Sache zu programmieren, wo sich scripte gegenseitig triggern und scripte auch parallel zur Ausführung kommen.

Um genauer monitoren zu können, welche Instanz eines Scriptes gerade welche Ausgabe macht, würde ich gerne noch eine „Tread-Nummer“ vor die Message-Ausgaben machen.

Kann ein Script wissen, in welcher Thread-Nummer es läuft? Wenn ja, über welche Variable kriege ich diese Info?

Danke
jwka

Hallo jwka.

Vielleicht ein wenig umständlich aber funktioniert.

for ( $x = 1; $x < 11; $x++ ) {
 $y = (IPS_GetScriptThread($x));
 if ($IPS_SELF = $y['ScriptID']) {
    echo "Aktiver Thread: ".$x;
 }
}

Solltest Du deine Threads erhöht haben dann die Zahl 11 in der for-Schleife anpassen. Wert = Anzahl deiner Threads + 1

Suppi! Danke.

Hatte zwar auf eine direkte Variable (wie die Magic Konstanten in PHP) gehofft, aber mit dieser Lösung kann ich gut leben. Bringt mich sehr nach vorne.

Die Threadanzahl kann man nicht auch irgendwo her kriegen?

Grüße
jwka

Hab es noch leicht modifiziert, so läuft das mit jeder beliebeigen Threadzahl:



for ( $x = 1; true; $x++ ):
 $Thread = (@IPS_GetScriptThread($x));
 if ($Thread === false):
   break;
 endif;
 if ($IPS_SELF = $Thread['ScriptID']):
    echo "Aktiver Thread: #".$x. "
";
 endif;
endfor;



Geht natürlich auch, die Threadanzahl bekäme man über

echo count(IPS_GetScriptThreadList());

by the way, dieses Script liefert auch durchaus interessantes zu Tage:



for ( $i = 1; true; $i++ ):
 $Thread = (@IPS_GetScriptThread($i));
 if ($Thread === false):
   break;
 endif;
 if ($IPS_SELF = $Thread['ScriptID']):
    echo "Aktiver Thread: #". $i . "
";
 endif;
endfor;


Also effektiv nach meiner Schreibweise so

for ( $x = 1; $x < count(IPS_GetScriptThreadList())+1; $x++ ) {
 $y = (IPS_GetScriptThread($x));
 if ($IPS_SELF = $y['ScriptID']) {
    echo "Aktiver Thread: ".$x;
 }
}

Ich mag keine Fehlerunterdrückung ala @:smiley:

Ich bin ja mal gespannt was uns deine Skripte so bescheren.

yep. auf das mit dem count() hätte ich auch selber kommen könne.

Aber das unterscheidet halt den alten Hasen vom Frischling.:o

Danke für den Denkanstoss.

Jetzt wäre - ich bin ja ein alter speedfanatiker und als ex Cobol Programmierer auf jede Milisekunde aus - noch zu fragen, ob es schneller ist, zuerst die Threadanzahl zu ermitteln und die Schleife dann so zu bauen oder ob der „Fehlzugriff“ im letzten Durchlauf ohne diese Nummer genauso schnell ist …

jwka

Ich bin ja mal gespannt was uns deine Skripte so bescheren.

Hmmm. War das eher ein „um gotteswillen, was’n das für einer“ oder wirkliches Interesse? (ich kann mit Beidem leben …)

Als einer der das Programmieren erst mit IPS erlernt hat freue ich mich über jedes Skript erst recht dessen Professionalität, also echtes Interesse.

Vielleicht kann ich es sogar gebrauchen.:smiley:

Also ich habe klar vor, mein erarbeitetes Wissen weiter zu geben.

Ich sehe vor allem, dass ich mir schon viel Zeit hätte sparen können (und dadurch wäre ich nicht unbedingt schlechter) wenn es mehr „Dokumentation“ und „Guidelines“ gäbe.

Deshalb war ja auch meine Frage an anderer Stelle, ob man nicht doch wieder ein Wiki aufmachen will. Ich würde da jedenfalls mitarbeiten.

Ich sehen da folgende Themen:

  • Wie gestalte ich meinen Objektbaum am sinnvollsten? (Das können ja mehrere Ansätze sein)

  • Service-Scripte, die einem das Leben leichter machen

  • Programmierhilfen (wie z.B. mein Debugging, das noch einige Releases vor sich hat)

  • Konkrete Lösungen
    (ich bastle z.B. an einer relativ ausgefeilten „Repeater“ Funktion für FS20 Befehle. Ziel ist ein selbstlernendes System, das Befehle, die potenziell nicht ankommen „repeatet“ und als Liste die problematischen Adressen auswirft)

  • Vorschläge für future Releases
    Ich mache z.B. einige Sachen heute schon so, dass ich mir Funktionen baue, die mit „IPS_“ anfangen. Wenn man da eine vernünftige Feedback-Loop mit dem Hersteller macht, können später die Scripte einfach mit den nativen Funktionen laufen. Mehr noch: IPS könnte sogar die Parameterstrukturen von künftigen Funktionen vorab veröffentlichen und via intelligenter includes (Versionsabhängig) kann heute schon eine Funtion von morgen verwendet werden.

p.s.
Da ich 20 Jahre+ in der IT gearbeitet habe und u.a. bei der IBM Tochter Lotus Mitglied in einem weltweiten Berater-Council war, habe ich schon ein klitzekleines bißchen Erfahrung, was man so alles erreichen kann - wenn man nur will und der Hersteller ein wenig offen ist.

Hier vielleicht noch ein konkretes Beispiel:

Ich benutze (noch unter V2.1) folgendes Script als „V2.2+ Library“, das in der Datei „_IPS_V021_next_FUNCTIONS.php“ steht:



/* *******************************************************************
	MAKE FUNCTIONS OF LATER RELEASE AVAILABLE FOR RELEASE 2.1
****************************************************************** */

function IPS_GetScriptThreadNumber(){
	for ( $i = 1; $i < count(IPS_GetScriptThreadList())+1; $i++ ):
		$ThreadInfo = IPS_GetScriptThread($i);
		if ($IPS_SELF = $ThreadInfo['ScriptID']):
	   	return($i);
		endif;
	endfor;
};

function IPS_GetParent($id=0){
	$obj = @IPS_GetObject($id);
	if ( $obj <> NULL ):
		return( $obj["ParentID"]);
	else:
		return( -1);
	endif;
};


Das include dazu, welches in der Datei „include.php“ steht, die von Versionswechsel zu Versionswechsel angepasst wird steht:

$Kernel = floatval(IPS_GetKernelVersion());
if ($Kernel < 2.2):
// LOAD OWN IPS_xxx() FUNCTIONS FROM FUTURE VERSIONS
include „_IPS_V021_next_FUNCTIONS.php“;
ENDIF;

und im code benutze ich schlicht:

include( include.php);

Mache ich morgen ein Update auf V2.2, dann wird einfach die Include Datei modifiziert und aus meiner „_IPS_V021_next_FUNCTIONS.php“ wird „_IPS_V022_next_FUNCTIONS.php“, die Funktionen die dann im IPS drin sind, fliegen aus der PHP raus und gut ist.

jwka