JSL-Rekursion verhindertSeit der Umstellung von JMP 12 auf JMP 13 stoße ich immer wieder auf Fehler aufgrund von „JSL-Rekursion verhindert“. Meistens ist das eine gute Sache, da ich schlechte Praktiken in meiner Codebasis beheben musste, oft schränkt es jedoch nur die Funktionalität ein. Ich sehe es derzeit in einem meiner Berichte. Ich habe eine Schaltfläche „Filter“, die die Anzeige erneut ausführt und benutzerdefinierte Daten herausfiltert. Wenn der Benutzer diese Schaltfläche zu oft drückt, wird die Fehlermeldung „JSL-Rekursion verhindert“ angezeigt, wodurch das Skript abgebrochen wird. Gibt es eine Möglichkeit, dies auszuschalten? Manchmal möchte ich eine Rekursion, das kann eine gute Sache sein! Dieser Fehler ist seit JMP 13 der Fluch meiner Existenz.
Betreff: JSL-Rekursion verhindertDanke Craig, das war sehr nützlich. Ja, ich verwende wait(0) in meinem Skript. Ich habe versucht, es auszutauschen, da ich mit dem Aktualisierungsfenster einen großen Geschwindigkeitsschub gesehen habe, aber ich glaube, dass ich „wait(0)“ verwenden muss. Dies beantwortet einige meiner Fragen und hilft mir, ein wenig besser zu verstehen, was unter der Haube vor sich geht. Danke!
Betreff: JSL-Rekursion verhindertVerwenden Sie wait()-Anweisungen? Möglicherweise können Sie auf die Verwendung von dt<<
Ich habe dies verwendet, um zu verstehen, was passiert:
New Window( "x",
t = Text Box( "" ),
Button Box( "updatewindow",
print("pressed updatewindow");
start = Tick Seconds();
For( i = 1, i < 1e3, i++,
t << settext( Char( i ) );
t << updatewindow;
);
stop = Tick Seconds();
t << settext( Char( stop - start, 4, 1 ) );
),
Button Box( "wait",
print("pressed wait");
start = Tick Seconds();
For( i = 1, i < 1e3, i++,
t << settext( Char( i ) );
Wait( 0 );
);
stop = Tick Seconds();
t << settext( Char( stop - start, 4, 1 ) );
)
);
Ändern Sie 1e3 in 1e4, wenn es zu schnell läuft. Die Schaltfläche „Warten“ ermöglicht die Verarbeitung von Ereignissen, einschließlich des Drückens einer der beiden Tasten während der Ausführung des Skripts, das „Warten“ ausführt. Die Schaltfläche „Updatewindow“ aktualisiert nur das Textfeld und stellt zusätzliche Klicks in die Warteschlange, bis das Skript abgeschlossen ist.
Manchmal ist wait() unvermeidlich; Wenn eine Plattform gestartet wird, wird sie nicht ohne wait() auf dem Bildschirm angezeigt. Und die Hintergrundverarbeitung von JMP erfordert auch ein wait() in einem Skript, das sich in einer Schleife befindet (Sockets, Laufprogramm, Datenbankverbindungen, wahrscheinlich andere).
Die Protokollmeldung sieht nicht so aus, als ob sie irgendetwas verletzen sollte; Ich denke, es ist nur eine Warnung, dass ein zweiter Druck derselben Taste vor Abschluss des Tastenskripts ignoriert wurde.
Betreff: JSL-Rekursion verhindertAlso habe ich eine Lösung für mein Problem gefunden, ich habe keine Ahnung, warum es funktioniert. Als erstes habe ich die Befehle „<< Get Selected“ in die Ausführungsfunktion verschoben und einfach das Kombinationsfeld übergeben. Dadurch wurden 99 % meiner Rekursionsprobleme behoben. Ich verstehe diesen Teil nicht. Wenn mir also jemand von JMP erklären könnte, warum das so ist, wäre ich dankbar.
Das zweite, was ich tun musste, war, die Schaltfläche zu deaktivieren, während der Code ausgeführt wurde. Wenn ein Benutzer schnell genug doppelklickte, würde dies einen Rekursionsfehler verursachen, da der erste Schaltflächenklick immer noch ausgeführt werden sollte. Dieser Teil macht für mich Sinn, aber es scheint nicht so, als müsste ich ihn umgehen. Ein Benutzer, der auf eine Schaltfläche klickt, sollte keinen Rekursionsfehler verursachen. Es sollte höchstens einfach den neuen Klick zum Verarbeitungsstapel hinzufügen; und zumindest sollte es den zusätzlichen Klick einfach ignorieren. Es sollte eigentlich nie versucht werden, es erneut auszuführen, um das Rekursionsproblem zu verursachen.
//Old Script
BBRun = button box("Run Filter",
layerId = layer_cb << Get Selected;
classId = class_cb << Get Selected;
runFunction(dt, layerid, classid);
)
//New Script
BBRun = button box("Run Filter",
BBRun << Enable(0);
runFunction(dt, layer_combobox, class_combobox);
BBRun << Enable(1);
)<BR /><BR />//Run Function for reference<BR />runFunction = function({dt, layer_cb, class_cb}, {Default Local}, <BR /> //Grab data<BR /> layerId = layer_cb << Get Selected;<BR /> classId = class_cb << Get Selected;<BR /> <BR /> //Create namespace to pass variables<BR /> If( !Namespace Exists( "filterCode_script" ),<BR /> FC = New Namespace( "filterCode_script" ),<BR /> FC = Namespace( "filterCode_script" )<BR /> );<BR /> //get unique defects<BR /> FC:defects = dt:defects[dt << Get Rows Where(:LAYER_ID == layerId & :CLASS_ID == classId)];<BR /> <BR /> //Create display window for subset<BR /> include("$ADDIN_HOME(myaddin)\Includes\filterWindow.include.jsl", <<NEW context=""></NEW> FC << Delete;<BR /> <BR />);<BR />