大家好。 我创建了一个带有进度条和“取消”按钮的窗口。 目的是允许用户停止程序执行。 但是,当我按取消时出现错误,并且不知道如何解决。 我的脚本的简化版本如下。
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<<