JSL 재귀 방지JMP 12에서 JMP 13으로 전환하면 "JSL 재귀 방지"로 인해 오류가 계속 발생합니다. 내 코드 기반에서 잘못된 관행을 수정해야 했기 때문에 대부분 이것은 좋은 일이지만 종종 기능을 제한합니다. 현재 보고 있는 보고서 중 하나에는 사용자 지정 데이터를 필터링하여 표시를 다시 실행하는 "필터" 버튼이 있습니다. 해당 버튼을 사용자가 너무 많이 누르면 스크립트를 종료하는 "JSL 재귀 방지" 오류가 발생합니다. 이것을 끄는 방법이 있습니까? 때때로 나는 재귀를 원한다. 그것은 좋은 일이 될 수 있다! 이 오류는 JMP 13 이후로 내 존재의 골칫거리였습니다.
Re: JSL 재귀 방지Craig에게 감사합니다. 이것은 매우 유익했습니다. 예, 스크립트에서 wait(0)을 사용하고 있습니다. 업데이트 창에서 큰 속도 향상을 보았기 때문에 전환을 시도했지만 wait(0)이 사용해야 할 것이라고 생각합니다. 이것은 내 질문 중 몇 가지에 대한 답을 제공하고 내부 상황을 조금 더 잘 이해하는 데 도움이 됩니다. 감사!
Re: 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의 백그라운드 처리는 또한 반복되는 스크립트(소켓, runprogram, 데이터베이스 연결, 기타)에 wait()를 필요로 합니다.
로그 메시지는 아무 것도 해칠 것 같지 않습니다. 버튼 스크립트가 완료되기 전에 동일한 버튼을 두 번째로 누르는 것이 무시되었다는 경고일 뿐이라고 생각합니다.
Re: JSL 재귀 방지그래서 나는 내 문제에 대한 해결책을 찾았지만 그것이 작동하는 이유를 모르겠습니다. 내가 한 첫 번째 일은 << Get Selected 명령을 실행 기능으로 옮기고 콤보 상자를 전달하는 것이었고 이것은 재귀 문제의 99%를 수정했습니다. 이 부분을 이해하지 못하므로 JMP의 누군가가 왜 이것이 필요한지 알려주시면 감사하겠습니다.
두 번째로 해야 할 일은 코드가 실행되는 동안 버튼을 비활성화하는 것이었습니다. 사용자가 충분히 빠르게 더블 클릭하면 여전히 실행을 시도하는 첫 번째 버튼 클릭으로 인해 재귀 오류가 발생할 수 있습니다. 이 부분은 나에게 의미가 있지만 주변에서 코딩해야 할 필요는 없는 것 같습니다. 사용자가 버튼을 클릭하면 재귀 오류가 발생하지 않아야 합니다. 기껏해야 처리 스택에 새 클릭을 추가하기만 하면 됩니다. 최소한 추가 클릭을 무시해야 합니다. 재귀 문제를 일으키기 위해 실제로 다시 실행을 시도해서는 안됩니다.
//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 />