想知道如何实现标题中的问题。我有一些从按钮按下运行的回调。这些回调,如果被数字关闭中断,将导致错误,因为函数似乎运行,然后被关闭函数关闭数字而中断,然后在数字关闭后回调似乎恢复。如何防止回拨被图形的关闭功能中断?
如果我将按钮的'Interruptible'
属性设置为'on'
,它可以防止其他回调中断它,但似乎不适用于图形的关闭功能。我的另一个想法是在图的'CloseRequestFcn'
回调中指定'closefunction'
,然后在删除图之前调用drawnow
来刷新事件队列,但这不起作用。
对我来说,最后一招是在运行回调时将图形的'CloseRequestFcn'
设置为''
,但这看起来很乏味。有没有一个标准的解决方案来完成这个?
编辑:
从MATLAB的文件:
注意如果中断回调是DeleteFcn或CreateFcn 回调或人物的CloseRequest或ResizeFcn回调,它 不管中断值的执行回调该对象的可中断属性为 。中断回调在下一个drawnow,figure,getframe,pause或waitfor 语句中启动 执行。图形的WindowButtonDownFcn回调例程或对象的ButtonDownFcn或回调例程按照上述规则进行处理。
因此,看来是interruptible
属性不影响关闭功能的情况。
编辑2:
好的,所以我觉得我发现了一个问题。这真是奇怪。其实我从MATLAB文档是回调只是中断发现,如果他们有interruptible
属性设置为on
AND:
If there is a drawnow, figure, getframe, waitfor, or pause command in the running callback, then MATLAB executes the interrupting callbacks which are already in the queue and returns to finish execution of the current callback.
我不使用任何的明确这些功能,所以事实证明我的大部分回调不能被closereqfcn
中断。但是,事实证明有些是,而为什么看起来很奇怪。如果有回调:
`大的计算 - > imshow - > imshow
large computation -> set -> set -> set -> set
其中set
命令设置轴visible
属性为off
,然后没有中断似乎发生,如果我退出回调
现在时,如果我有:
large computation -> imshow -> set -> imshow -> set
如果我在第二个set
命令的回调期间退出,matlab会发出错误。另外,如果我有:
large computation -> imshow -> imshow -> set
MATLAB发出一个错误,如果第一set
命令的回调过程中我退出。如果我在回调过程中取消
large computation -> imshow -> imshow -> imshow
还发行了第三imshow
错误。
由于某种原因,似乎连续拨打两个imshow
致使我的回调中断。是否有可能matlab隐式调用drawnow
或做一些奇怪的事情,如果你使用多个imshow
?顺便说一句,我的matlab版本是R2009a。
一个解决方法可以在'CloseRequestFcn'可以启动计时器,并在计时器回调试图关闭这个数字如果没有通过检查**标志中断任何重要的回调**('close_allowed'),你当数字不应该被关闭时(例如在重要进程中)设置为false。 – pm89
在我看来,导致错误的实际问题是回调中使用的数据会被删除。在图形之外创建所需的数据副本可能是一个想法(无论如何,这是一个很好的做法)。也许用'copyfig'到一个隐藏的窗口,或者只是在回调开始时手动存储你所需要的。完成后请务必清理干净。 – bdecaf
@bdecaf不仅仅如此。有时我必须更新可见的数字轴。如果该回调被图形关闭中断,则它会尝试更新不存在的轴手柄。看起来很奇怪的matlab会这样做。这似乎使任何回调都可以被数字关闭中断。如何让这种行为更安全? – Justin