本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

中断回调执行

利用 MATLAB®,您可以控制回调函数在执行期间能否被中断。例如,可以创建中断动画的回调,以允许用户停止动画循环。其他情况下,当运行回调的顺序非常重要时,可能需要禁止潜在的中断。例如,可以禁止中断用于显示不同图像区块的 WindowButtonMotionFcn 回调。

如何控制中断

回调函数根据其在队列中的顺序执行。如果某个回调正在执行,并且用户操作触发了另一个回调,这时第二个回调会尝试中断第一个回调。第一个回调为运行中回调。第二个回调为中断回调

以下两个属性值用于控制对中断尝试的响应:

  • 运行中回调所属对象的 Interruptible 属性决定着是否允许中断。值 'on' 允许中断。值 'off' 不允许中断。默认值为 'on'

  • 如果不允许中断,则中断回调所属对象的 BusyAction 属性确定 MATLAB 是将中断回调纳入队列还是将其忽略。值 'queue' 允许在运行中回调完成执行后执行中断回调。值 'cancel' 忽略中断回调。默认值为 'queue'

允许中断时的回调行为

当对象的 Interruptible 属性设置为 'on' 时,其回调可在下次发生以下命令之一时被中断:drawnowfiguregetframewaitforpausewaitbar

  • 如果运行中回调包含以上命令之一,则 MATLAB 将停止执行运行中回调并执行中断回调。当中断回调完成时,MATLAB 将继续执行运行中回调。

  • 如果运行中回调不包含以上命令之一,则 MATLAB 执行完当前回调,不会出现任何中断。

有关可中断属性及其影响的详细信息,请参阅 UIControl 属性 页中的 Interruptible 属性说明。

示例

此示例说明如何使用 InterruptibleBusyAction 属性以及一个等待条来控制回调中断。

复制源文件

  1. 在 MATLAB 中,将当前文件夹设为您拥有写入访问权限的文件夹。

  2. 执行以下 MATLAB 命令:
    copyfile(fullfile(docroot, 'techdoc','creating_guis','examples',...
    'callback_interrupt.m')),fileattrib('callback_interrupt.m', '+w');

运行示例代码

执行 callback_interrupt 命令。程序随即显示两个窗口。

点击特定的按钮对组将会演示不同属性值组合的影响:

  • 回调中断 - 点击 Wait (interruptible),然后立即点击第二个窗口中的任一按钮:Surf Plot (queue)Mesh Plot (cancel)。随即显示等待条,但很快就被绘图操作中断。

  • 回调排队 - 点击 Wait (uninterruptible),然后立即点击 Surf Plot (queue)。等待条运行至完成。然后显示曲面绘图。

  • 回调取消 - 点击 Wait (uninterruptible),然后立即点击 Mesh Plot (cancel)。等待条运行至完成。不显示绘图,因为 MATLAB 会忽略网格绘图回调。

查看源代码

在创建各个按钮时,InterruptibleBusyAction 属性作为输入参数传递到 uicontrol 函数。

以下是创建 Wait (interruptible) 普通按钮的命令。请注意,Interruptible 属性设为 'on'

h_interrupt = uicontrol(h_panel1,'Style','pushbutton',...
                        'Position',[30,110,120,30],...
                        'String','Wait (interruptible)',...
                        'Tooltip','Interruptible = on',...
                        'Interruptible','on',...
                        'Callback',@wait_interruptible);

以下是创建 Wait (uninterruptible) 普通按钮的命令。请注意,Interruptible 属性设为 'off'

h_nointerrupt = uicontrol(h_panel1,'Style','pushbutton',...
                        'Position',[30,40,120,30],...
                        'String','Wait (uninterruptible)',...
                        'Tooltip','Interruptible = off',...
                        'Interruptible','off',...
                        'Callback',@wait_uninterruptible);

以下是创建 Surf Plot (queue) 普通按钮的命令。请注意,BusyAction 属性设为 'queue'

hsurf_queue = uicontrol(h_panel2,'Style','pushbutton',...
                        'Position',[30,200,110,30],...
                        'String','Surf Plot (queue)',...
                        'BusyAction','queue',...
                        'Tooltip','BusyAction = queue',...
                        'Callback',@surf_queue);

以下是创建 Mesh Plot (cancel) 普通按钮的命令。请注意,BusyAction 属性设为 'cancel'

hmesh_cancel = uicontrol(h_panel2,'Style','pushbutton',...
                        'Position',[30,130,110,30],...
                        'String','Mesh Plot (cancel)',...
                        'BusyAction','cancel',...
                        'Tooltip','BusyAction = cancel',...
                        'Callback',@mesh_cancel);

另请参阅

| | |

相关主题