想知道如何实现标题中的问题。我有一些从按钮按下运行的回调。这些回调,如果被图形关闭中断,将导致错误,因为该函数似乎正在运行,然后被关闭图形的关闭函数中断,然后回调似乎在图形关闭后恢复。
如果我将按钮的'Interruptible'
属性设置为'on'
,它可以防止其他回调中断它,但似乎不适用于图形的关闭功能。我的另一个想法是在图形'closefunction'
的'CloseRequestFcn'
回调中指定 ,然后drawnow
在删除图形之前调用以刷新事件队列,但这不起作用。
对我来说,最后的手段是在运行回调时简单地设置数字'CloseRequestFcn'
,''
但这似乎很乏味。有没有标准的解决方案来实现这一点?
编辑:
来自 matlab 的文档:
注意 如果中断回调是 DeleteFcn 或 CreateFcn 回调或图窗的 CloseRequest 或 ResizeFcn 回调,则无论该对象的 Interruptible 属性的值如何,它都会中断正在执行的回调。中断回调在下一个 drawow、figure、getframe、pause 或 waitfor 语句处开始执行。图形的 WindowButtonDownFcn 回调例程,或对象的 ButtonDownFcn 或 Callback 例程根据上述规则进行处理。
因此,该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
set
如果我在第一个命令的回调期间退出,matlab 会发出错误。
large computation -> imshow -> imshow -> imshow
imshow
如果我在回调期间取消,也会在第三次发出错误。
出于某种原因,似乎两次连续调用imshow
使我的回调可中断。如果您使用多个 s ,matlab 是否可能隐式调用drawnow
或做一些奇怪的事情imshow
?顺便说一句,我的 matlab 版本是 R2009a。