主要内容

中断执行回调

MATLAB®让您控制回调函数在执行时是否可以被中断。有时你可能想要允许别人打断你。例如,您可以通过创建一个中断动画的回调来允许用户停止动画循环。在其他时候,当正在运行的回调的顺序很重要时,您可能想要防止潜在的中断。例如,为了让应用程序响应更快,你可能会阻止响应指针移动的回调的中断。

打断了回调行为

回调函数根据它们在队列中的顺序执行。如果一个回调正在执行,并且一个用户动作触发了第二个回调,第二个回调尝试中断第一个回调。第一个回调是跑回调.第二个回调是打断回调

在正在运行的回调中出现的某些命令会导致MATLAB处理回调队列的其余部分。当它执行这些命令之一时,MATLAB确定回调中断行为。这些命令包括drawnow数字uifiguregetframe等待,暂停

如果正在运行的回调不包含这些命令之一,则不会发生中断。MATLAB首先完成运行回调的执行,然后执行中断回调。

如果正在运行的回调函数确实包含这些命令之一,则可中断拥有正在运行的回调的对象的属性决定中断是否发生:

  • 如果可中断“上”,则中断发生。当MATLAB处理回调队列时,它暂停正在运行的回调的执行,并执行中断的回调。中断回调完成后,MATLAB将继续执行正在运行的回调。

  • 如果可中断“关闭”,则不发生中断。相反,BusyAction属性决定了MATLAB对中断回调做什么:

    • 如果BusyAction“队列”, MATLAB在运行回调结束后执行中断回调。

    • 如果BusyAction“取消”, MATLAB丢弃了中断回调。

的默认值可中断“上”,默认值为BusyAction“队列”

最后,如果中断回调是DeleteFcnCloseRequestFcn,或SizeChangedFcn的值,则中断发生,而不管可中断财产。

控制回调中断行为

这个例子展示了可中断BusyAction组件属性交互产生不同类型的回调中断行为。

创建一个名为callbackBehavior.m在当前文件夹中,并在其中定义同名函数。这个函数创建了一个有两个图形窗口的应用程序,每个窗口有两个按钮。每个按钮都有一个ButtonPushedFcn回调和不同的回调执行属性值。如果您单击一个按钮,然后在第一个按钮完成之前单击第二个按钮,那么第二个按钮的回调将尝试中断第一个按钮。当单击第一个窗口中的按钮时,将显示并更新一个进度对话框。单击第二个窗口中的按钮将绘制数据。您可以通过定义两个按钮的中断行为来控制发生的事情。

函数callbackBehavior%创建数字和网格布局图一= uifigure (“位置”,[400 600 500 150]);g1 = uigridlayout(图一,(2,2));图= uifigure (“位置”,[400 100 500 400]);g2 = uigridlayout(图3 2,...“RowHeight”, {“1 x”“1 x”“8 x”});%为第一个数字窗口创建标签lbl1 = uilabel (g1,“文本”“1。点击一个按钮来清除坐标轴并生成一个进度对话框。”);lbl1.Layout。Column = [1 2];lbl1。HorizontalAlignment =“中心”%创建创建进度对话框的按钮中断= uibutton (g1,...“文本”“等(可中断)”...“可中断”“上”...“ButtonPushedFcn”, @createProgressDlg);nointerrupt = uibutton (g1,...“文本”“等(非可中断)”...“可中断”“关闭”...“ButtonPushedFcn”, @createProgressDlg);%为第二个图形窗口创建标签lbl2 = uilabel (g2,“文本”“2。点击一个按钮绘制一些数据。”);lbl2.Layout。Column = [1 2];lbl2。HorizontalAlignment =“中心”创建坐标轴ax = uiaxes (g2);ax.Layout.Row = 3;x. layout . column = [1 2];%创建用于绘制数据的按钮队列= uibutton (g2,...“文本”的情节(队列)...“BusyAction”“队列”...“ButtonPushedFcn”@ (src、事件)冲浪(ax,山峰(35)));queue.Layout.Row = 2;queue.Layout.Column = 1;取消= uibutton (g2,...“文本”的情节(取消)...“BusyAction”“取消”...“ButtonPushedFcn”@ (src、事件)冲浪(ax,山峰(35)));cancel.Layout.Row = 2;cancel.Layout.Column = 2;%回调函数来创建和更新进度对话框函数createProgressDlg (src、事件)%明显轴班(ax,“重置”%创建对话框dlg = uiprogressdlg(图一,“标题”“请稍等”...“消息”“加载…”);步骤= 250;步骤= 1:步骤%更新进展了解地理。值= /步骤;暂停(0.01)结束关闭(dlg)结束结束

调用callbackBehavior命令,显示图形窗口。

callbackBehavior

图包含一个uigridlayout类型的对象。

图包含一个轴对象和一个uigridlayout类型的对象。axis对象是空的。

点击成对的按钮可以看到不同组合的效果可中断BusyAction属性值。

  • 回呼中断-单击等待(可中断)紧随其后的是第二个窗口中的任意一个按钮:情节(队列)情节(取消).因为第一个按钮有它的可中断值设置为“上”,中断发生。情节出现时,进程对话框仍在运行。

  • 回调队列-单击等待(非可中断)立即紧随其后情节(队列).因为第一个按钮有它的可中断值设置为“上”第二个按钮是它的BusyAction值设置为“队列”,排队发生。进度对话框运行到完成。然后,情节显示出来。

  • 取消回叫-单击等待(非可中断)立即紧随其后情节(取消).因为第一个按钮有它的可中断值设置为“上”第二个按钮是它的BusyAction值设置为“取消”,取消发生。进度对话框运行到完成。但是,没有绘图出现,因为MATLAB®已经丢弃了绘图回调。

另请参阅

|||

相关的话题