こんにちは、みんな。 プログレスバーと[キャンセル]ボタンのあるウィンドウを作成しました。 その目的は、ユーザーがプログラムの実行を停止できるようにすることです。 キャンセルを押すとエラーが発生し、解決方法がわかりません。 私のスクリプトの簡略版を以下に示します。
Names Default to Here(1);
//Define progress window
pwin = NewWindow("Progress",
SB_L = SpacerBox(Size(0, 15), Color("Green")),
ButtonBox("Cancel",
pwin << Close Window;
Stop();
)
);
//Sample Loop
For(i=1, i<=10, i++,
SB_L << Size(i*10, 15); //update the progress bar
Wait(1); //rest of loop
);ループの実行中にキャンセルを押すと、次のエラーが発生します。
deleted object reference: SB_L << Size(i * 10, 15) in access or evaluation of 'Glue' , pwin = New Window("Progress",
SB_L = Spacer Box(Size(0, 15), Color("Green")),
Button Box("Cancel",
pwin << Close Window;
Stop();
)
); /*###*/For(i = 1, i <= 10, i++,
SB_L << Size(i * 10, 15);
Wait(1);
) /*###*/;キャンセルボタンを押すと、進行状況ウィンドウが閉じてから実行が停止することが期待されます。 ただし、少なくとも1回は継続しているように見え、ForループのSB_L << Size()行で失敗します。 進行状況ウィンドウが閉じてSB_Lが削除されたために失敗しますが、Stop()コマンドが発行された場合にこの行が実行される理由がわかりません。
Stop()コマンドを実行した後もプログラムの実行が継続していることは正しいですか? [キャンセル]ボタンが押された後、SB_L << Size()コマンドの実行を防ぐにはどうすればよいですか?
詳細:
JMPプロ15.2.1
Mac OS Big Sur v11.6
ありがとう。
やあ@nikles 。 あなたはからこの最近の投稿をチェックしたいかもしれません@Craige_Hales 、キャンセルボタン付きプログレスバー。
Ryan(およびCraige)に感謝します。 これは私が間違いなく検討しているオプションの1つでしたが、メインスクリプト本体のif句にフラグを送信する必要があります。 私の願いは、[キャンセル]ボタンのStop()コマンドを使用してプログラムの実行を停止することです。 たぶん私は私の質問を再構成することができます:なぜ私のStop()コマンドは実行を停止しないように見えるのですか?
何か他の面白いことに気づきました。 [キャンセル]ボタンスクリプトで「pwin << Close Window()」コマンドをコメントアウトしても、キャンセルボタンで実行が停止しなくなりました。 Stop()コマンドをボタンから実行すると、Forループを停止できないようです。 ウィンドウを削除するとエラーが発生したため、キャンセルボタンは以前に実行を停止できました。
wait(n)はJMPで必要な悪であり、可能な限り回避する必要があります。 待機中、待機を呼び出すスクリプトは一時停止されますが、OSはクリックを認識したり、開いているウィンドウを表示したりすることができます。 クリックを使用して、最初のスクリプトの環境に触れる別のスクリプト(例)を開始できるため、奇妙なことが起こる可能性があります。 あなたの例では、stop()は2番目のスクリプトを停止しています。 また、グローバルフラグを設定することもできます。 プロジェクトがグローバル変数の追跡を心配するほど大きい場合は、名前空間を使用することもできます。
それで、起こり得る奇妙なことは何ですか? ほとんどの場合、ウィンドウが閉じられているか、ディスプレイボックスが削除されています。 特に、wait(1)を使用するスクリプトを持つクリック関数を想像してください。そして、0.5秒後にボタンをもう一度クリックします。 スクリプトの2番目のコピーが最初のコピー内で実行されています。 元のwait(1)は、2番目のスクリプトが終了するまで戻りません。 2番目のスクリプトがボタンが存在するウィンドウを閉じる場合、元のスクリプトの周囲にはどのような環境がありますか? (待機前と同じではありません!)正当な理由なしに待機を必要とするスクリプトを作成しないでください。ほとんどの場合、displaybox << updatewindowまたはdatatable << runformulasの方が適しています。