防止 JSL 递归从 JMP 12 切换到 JMP 13,由于“阻止了 JSL 递归”,我一直在遇到错误。 大多数情况下这是一件好事,因为我不得不在我的代码库中修复不良做法,但通常它只是限制了功能。 我目前在我的一份报告中看到它有一个“过滤器”按钮,它重新运行显示过滤掉用户指定的数据。 如果用户按下该按钮太多次,他们会收到“阻止 JSL 递归”错误,从而终止脚本。 有没有办法关闭它? 有时我想要递归,这可能是件好事! 自 JMP 13 以来,这个错误一直是我存在的祸根。
回复:JSL 递归被阻止谢谢克雷格,这非常有益。 是的,我在脚本中使用了 wait(0)。 我尝试将其切换出去,因为我看到更新窗口的速度大幅提升,但我相信 wait(0) 是我需要使用的。 这确实回答了我的几个问题,并帮助我更好地理解引擎盖下发生的事情。 谢谢!
回复:JSL 递归被阻止你在使用 wait() 语句吗? 也许您可以切换到使用 dt<<
我用它来试图了解发生了什么:
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 ) );
)
);
如果运行太快,请将 1e3 更改为 1e4。 “等待”按钮允许处理事件,包括在“等待”正在运行的脚本期间按下任一按钮。 “updatewindow”按钮仅更新文本框并将额外的点击排队,直到脚本完成。
有时 wait() 是不可避免的;启动平台时,如果没有 wait(),它将不会出现在屏幕上。 JMP 的后台处理还需要在循环的脚本(套接字、运行程序、数据库连接,可能还有其他)中使用 wait()。
日志消息看起来不应该伤害任何东西;我认为这只是警告在按钮脚本完成之前第二次按下同一按钮已被忽略。
回复:JSL 递归被阻止所以我想出了一个解决我的问题的方法,我不知道它为什么会起作用。 我做的第一件事是将 << Get Selected 命令移到运行功能中,然后传递组合框,这解决了我 99% 的递归问题。 我不明白这部分,所以如果 JMP 的任何人能告诉我为什么会这样,我将不胜感激。
我必须做的第二件事是在代码运行时禁用按钮,b/c 如果用户双击速度足够快,由于第一个按钮单击仍试图运行,它会导致递归错误。 这部分对我来说很有意义,但似乎我不应该围绕它编写代码。 用户单击按钮不应导致递归错误。 最多,它应该只是简单地将新点击添加到处理堆栈中;至少它应该忽略额外的点击。 它不应该真正尝试再次运行它以导致递归问题。
//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 />