我正在编写一个GUI,我需要在特定条件下显示一个对话框。问题是关闭对话框会暂时冻结GUI,从一秒钟到5-6秒。
编辑:更准确地说,一旦打开对话框,它就需要一定的时间才能关闭。如果我等一会儿再试图关闭它,就没有延迟。关闭对话框后,图上的任何其他GUI操作(包括关闭)也需要我等待几秒才能完成。
我提出的最小例子如下:
function testdlg(varargin)
if nargin >= 1 && isnumeric(varargin{1})
n = varargin{1};
else
n = 9;
end
main = figure;
for i = 1:n
for j = 1:n
uicontrol('style', 'pushbutton', 'string', [int2str(i) ', ' int2str(j)], ...
'units', 'normalized', 'position', [0.101*(i-1) + 0.0 0.06*(j-1) + 0.4 0.1 0.05], ...
'callback', @displayDialog);
end
end
if ~any(strcmpi(varargin, 'noax'))
axes('units', 'normalized', 'position', [0 0.01 0.3 0.3]);
end
uiwait(main);
end
function displayDialog(varargin)
d = dialog('name', 'Dialog');
uiwait(d);
end
简要描述一下:该功能创建一个网格(默认情况下为9x9)按钮和一组图中的轴。使用回调函数,以便单击任何按钮打开一个空对话框。
以下是发生的事情。如果永远不会调用回调(即,没有点击按钮)并且数字已关闭,则一切都很快并且没有延迟。但是,如果单击一个按钮并显示对话框,则在打开对话框后立即尝试关闭对话框会在实际关闭之前显示出很长的延迟(在我的机器上大约一秒钟)。在对话框关闭后尝试快速关闭图形时,图形关闭的延迟时间也相似。任何其他GUI交互也会延迟(因此按下按钮打开另一个对话框也会显示一秒延迟)。
编辑:我稍微更新了上面的文字:在尝试执行GUI操作时,实际上似乎没有发生延迟,而是在每次GUI操作之后(如打开或关闭对话框,但只有在打开对话框的情况下),GUI才会运行几秒钟。
轴和按钮对此行为都很重要。如果删除轴(通过调用testdlg noax
),则没有延迟。将按钮数量减少到5x5网格或更小(通过调用,例如 testdlg(5)
)也可以消除延迟。由于在这些情况下没有明显的延迟,我看到的延迟不仅仅是由于Matlab处理一个轴所需的时间总和以及处理> 25个按钮所需的时间:延迟I看到比仅显示轴或仅显示按钮时看到的延迟总和要长得多。因此,效果必须以某种方式归因于轴和按钮之间的相互作用。
这是我从我所做的测试中得知的:
uiwait
来电,不:完全删除它们不会影响延迟'WindowStyle', 'normal'
不会改变任何内容)figure
而不是dialog
表现出相同的行为)'auto'
的所有轴选项设置为'manual'
,但没有成功'pushbutton'
更改为'popup'
不会改变延迟,但在关闭对话框后下拉菜单的外观会有一些变化,这会在一秒钟后慢慢恢复正常'text'
控件代替'pushbutton'
或'popup'
确实可以消除延迟。之前有没有人注意到这样的事情? Matlab是否尝试进行一些布局计算,当轴被许多按钮包围时,其复杂性会快速增长?有没有办法阻止它做它想做的事情?
探查器显示了在用户尝试关闭窗口时调用的Matlab默认closereq
函数花费的大量时间。所有这一切基本上都删除了这个数字。但是,如果我设置了自己的CloseRequestFcn
并尝试计时delete
,则需要很短的时间。
我在这一点上非常难过 - 如果这是一个错误,那将是一个非常令人困惑的错误。任何想法都非常受欢迎。我在Mac OS 10.11.6上运行R2015b(8.6.0.267246),如果有任何帮助的话。