在 UI 中创建一个暂停回调执行的按钮

有时我们想暂停代码执行以检查应用程序的状态(请参阅调试 )。通过 MATLAB 编辑器运行代码时,可以使用 UI 中的暂停按钮或按 Ctrl + c (在 Windows 上)完成此操作。但是,当从 GUI 启动计算时(通过某些 uicontrol 的回调),此方法不再起作用,并且应通过另一个回调中断回调。以下是这个原则的演示:

function interruptibleUI
dbclear in interruptibleUI % reset breakpoints in this file
figure('Position',[400,500,329,160]); 

uicontrol('Style', 'pushbutton',...
          'String', 'Compute',...
          'Position', [24 55 131 63],...
          'Callback', @longComputation,...
          'Interruptible','on'); % 'on' by default anyway
      
uicontrol('Style', 'pushbutton',...
          'String', 'Pause #1',...
          'Position', [180 87 131 63],...
          'Callback', @interrupt1);       

uicontrol('Style', 'pushbutton',...
          'String', 'Pause #2',...
          'Position', [180 12 131 63],...
          'Callback', @interrupt2);    

end

function longComputation(src,event)
  superSecretVar = rand(1);
  pause(15);
  print('done!'); % we'll use this to determine if code kept running "in the background".
end

function interrupt1(src,event) % depending on where you want to stop
  dbstop in interruptibleUI at 27 % will stop after print('done!');
  dbstop in interruptibleUI at 32 % will stop after **this** line.
end

function interrupt2(src,event) % method 2
  keyboard;
  dbup; % this will need to be executed manually once the code stops on the previous line.
end

要确保你了解此示例,请执行以下操作:

  1. 将上面的代码粘贴到一个名为的新文件中,并将其保存为 interruptibleUI.m,这样代码就会从文件的第一行开始 (这对第一种方法起作用很重要)。
  2. 运行脚本。
  3. 点击,Compute 然后不久点击其中一个 Pause #1 或 Pause #2。
  4. 确保你能找到 superSecretVar 的价值。