Récursivité JSL empêchéeDepuis le passage à JMP 13 à partir de JMP 12, je continue à rencontrer des erreurs dues à la "récursivité JSL empêchée". C'est généralement une bonne chose car j'ai dû corriger de mauvaises pratiques dans ma base de code, mais cela limite souvent les fonctionnalités. Là où je le vois actuellement, c'est dans l'un de mes rapports que j'ai un bouton "filtrer", qui relance l'affichage en filtrant les données spécifiées par l'utilisateur. Si ce bouton est appuyé trop de fois par l'utilisateur, il obtient une erreur "Récursion JSL empêchée" qui tue le script. Existe-t-il un moyen de désactiver cela ? Parfois j'ai envie de récursivité, ça peut être une bonne chose ! Cette erreur est le fléau de mon existence depuis JMP 13.
Re : récursivité JSL empêchéeMerci Craig, cela a été très bénéfique. Oui, j'utilise wait(0) dans mon script. J'ai essayé de le désactiver depuis que j'ai vu une grande augmentation de vitesse avec la fenêtre de mise à jour, mais je pense que l'attente (0) est ce que j'aurai besoin d'utiliser. Cela répond à plusieurs de mes questions et m'aide à comprendre un peu mieux ce qui se passe sous le capot. Merci!
Re : récursivité JSL empêchéeUtilisez-vous des instructions wait () ? Peut-être que vous pouvez passer à l'utilisation de dt<<
J'ai utilisé ceci pour essayer de comprendre ce qui se passe:
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 ) );
)
);
changez le 1e3 en 1e4 s'il tourne trop vite. Le bouton « attendre » permet aux événements de traiter, y compris l'un ou l'autre des boutons à appuyer pendant le script que « attendre » est en cours d'exécution. Le bouton "mettre à jour la fenêtre" met uniquement à jour la zone de texte et met en file d'attente les clics supplémentaires jusqu'à la fin du script.
Parfois, wait() est inévitable ; lorsqu'une plate-forme est lancée, elle n'apparaîtra pas à l'écran sans attendre(). Et le traitement en arrière-plan de JMP nécessite également un wait () dans un script en boucle (sockets, runprogram, connexions à la base de données, probablement autres).
Le message du journal ne semble pas devoir nuire à quoi que ce soit ; Je pense que c'est juste un avertissement qu'une deuxième pression sur le même bouton avant la fin du script du bouton a été ignorée.
Re : récursivité JSL empêchéeJ'ai donc trouvé une solution à mon problème, je ne sais pas pourquoi cela fonctionne. La première chose que j'ai faite a été de déplacer les commandes << Get Selected dans la fonction d'exécution et de passer simplement la zone de liste déroulante, ce qui a résolu 99% de mes problèmes de récursivité. Je ne comprends pas cette partie, donc si quelqu'un de JMP pouvait m'éclairer pourquoi ce serait, je l'apprécierais.
La deuxième chose que je devais faire était de désactiver le bouton pendant que le code était en cours d'exécution, car si un utilisateur double-cliquait assez rapidement, cela provoquerait une erreur de récursivité en raison du premier clic sur le bouton essayant toujours de s'exécuter. Cette partie a du sens pour moi, mais il ne semble pas que je devrais avoir à coder autour d'elle. Un utilisateur cliquant sur un bouton ne devrait pas provoquer d'erreur de récursivité. Tout au plus, il devrait simplement ajouter le nouveau clic sur la pile de traitement ; et au moins, il devrait simplement ignorer le clic supplémentaire. Il ne devrait jamais essayer de l'exécuter à nouveau pour provoquer le problème de récursivité.
//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 />