大家好。 我創建了一個帶有進度條和“取消”按鈕的窗口。 目的是允許用戶停止程序執行。 但是,當我按取消時出現錯誤,並且不知道如何解決。 我的腳本的簡化版本如下。
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);
) /*###*/;當按下取消按鈕時,我的期望是進度窗口應該關閉,然後執行應該停止。 但它似乎繼續進行至少一次迭代,並在 For 循環中的 SB_L << Size() 行失敗。 它失敗是因為進度窗口已關閉並且 SB_L 已被刪除,但我很困惑,如果發出 Stop() 命令,為什麼會執行此行?
我是否更正了即使在我的 Stop() 命令之後程序仍在繼續執行? 按下“取消”按鈕後,如何防止執行 SB_L << Size() 命令?
細節:
JMP 專業版 15.2.1
Mac OS Big Sur v11.6
謝謝。
感謝瑞安(和克雷格)。 這是我肯定會考慮的一種選擇,但它需要向主腳本正文中的 if 子句發送一個標誌。 我的願望是使用 Cancel 按鈕中的 Stop() 命令來停止程序執行。 也許我可以重新定義我的問題:為什麼我的 Stop() 命令似乎沒有停止執行?
剛剛注意到其他有趣的事情。 如果我在取消按鈕腳本中註釋掉“pwin << Close Window()”命令,取消按鈕不再停止執行。 從按鈕執行時,Stop() 命令似乎無法停止 For 循環。 取消按鈕之前能夠停止執行只是因為刪除窗口會產生錯誤。
wait( n ) 在 JMP 中是必要的邪惡,應盡可能避免。 在等待期間,調用 wait 的腳本會暫停,而操作系統可以執行某些操作,例如識別單擊或使打開的窗口可見。 可能會發生奇怪的事情,因為您可以使用單擊來啟動另一個腳本(您的示例),該腳本觸及第一個腳本的環境。 在您的示例中, stop() 正在停止第二個腳本。 它還可以設置一個全局標誌。 如果您的項目大到足以擔心跟踪全局變量,您也可以使用名稱空間。
那麼會發生什麼奇怪的事情呢? 主要是關閉窗口或刪除顯示框。 特別是,想像一個 click 函數,它有一個使用 wait(1) 的腳本,半秒後再次點擊該按鈕。 腳本的第二個副本在第一個副本中運行。 在第二個腳本完成之前,原始的 wait(1) 不會返回。 如果第二個腳本關閉了按鈕所在的窗口,那麼原始腳本周圍的環境是什麼? (與等待之前不同!)不要構建需要等待而沒有充分理由的腳本;大多數時候 displaybox<<