JSL 再帰の防止JMP 12 から JMP 13 への切り替えから、「JSL 再帰防止」が原因でエラーが発生し続けます。 コードベースの悪い慣行を修正する必要があったため、ほとんどの場合、これは良いことですが、多くの場合、機能が制限されるだけです。 現在、レポートの 1 つに表示されているのは、「フィルター」ボタンがあり、ユーザーが指定したデータを除外して表示を再実行します。 ユーザーがそのボタンを何度も押した場合、「JSL 再帰が防止されました」というエラーが発生し、スクリプトが強制終了されます。 これをオフにする方法はありますか? 再帰が必要な場合もありますが、これは良いことです。 このエラーは、JMP 13 以降、私の悩みの種でした。
Re: JSL の再帰が防止されましたクレイグに感謝します。これは非常に有益でした。 はい、スクリプトで 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() が必要です。
ログメッセージは、何かを傷つけるようには見えません。ボタンスクリプトが終了する前に同じボタンを2回押しても無視されたことを警告しているだけだと思います。
Re: JSL の再帰が防止されましただから私は自分の問題の解決策を見つけましたが、なぜそれが機能するのかわかりません。 私が最初にしたことは、<< Get Selected コマンドを run 関数に移動し、コンボ ボックスを渡すことでした。これにより、再帰の問題の 99% が修正されました。 私はこの部分を理解していないので、JMP の誰かがこれがなぜなのかを教えてくれたら幸いです。
私がしなければならなかった2番目のことは、コードの実行中にボタンを無効にすることでした.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 />