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 />