在Matlab函数中,我想知道用户上次与Matlab GUI交互的时间。通过matlab GUI,我的意思是用户在命令窗口中输入或在编辑器中输入。
我希望实现的算法基本上是:
如果已经有一段时间了,该功能将不会抓住焦点,而是在后台运行。 如果用户最近进行了互动,可能他/她现在对结果感兴趣,并且该功能将抓住焦点。
答案 0 :(得分:2)
这是一个艰难的!这是一个基于此undocumented code和persitent variables仅使用命令窗口执行所需操作的建议。
我使用了两个功能:CW_listen
和CW_callback
。对CW_listen
(或CW_listen(true)
)的调用开始侦听命令窗口,而对CW_listen(false)
的调用则停止侦听。在侦听时,在命令窗口上执行的任何操作都会触发对CW_callback
的调用。
以下是两个功能:
function CW_listen(b)
% Default value
if ~exist('b', 'var'), b = true; end
% Get the reference handle to the Command Window text area
jDesktop = com.mathworks.mde.desk.MLDesktop.getInstance;
try
cmdWin = jDesktop.getClient('Command Window');
jTextArea = cmdWin.getComponent(0).getViewport.getComponent(0);
catch
commandwindow;
jTextArea = jDesktop.getMainFrame.getFocusOwner;
end
% Instrument the text area's callback
if b
set(jTextArea,'CaretUpdateCallback',@CW_callback);
else
set(jTextArea,'CaretUpdateCallback',[]);
end
和
function CW_callback(varargin)
% Define a persistent variable
persistent last_call;
if isempty(last_call)
last_call = clock;
else
ts = clock;
Dt = etime(ts, last_call);
% Update the status bar
dt = javaMethod('getInstance', 'com.mathworks.mde.desk.MLDesktop');
if dt.hasMainFrame
dt.setStatusText(['Ellapsed time: ' num2str(Dt) 's']);
end
if Dt>5
fprintf('So long !\n');
last_call = ts;
else
% Do nothing
end
end
我还在状态栏中显示了耗时的时间,这对于开发代码非常有用,并且添加了一个非常酷的功能。
您可以通过您选择的任何操作替换以秒为单位的时间(此处为5s)和fprintf('So long !\n');
。请注意,在此if
语句之外插入任何类型的显示都将导致无限的显示循环...
目前我还没有看到如何将其转换为编辑器,但如果您在Undocumented Matlab中搜索,则可能会发现该怎么做;)