如何确定用户上次与matlab GUI交互的时间?

时间:2015-03-26 18:28:49

标签: matlab user-interface

在Matlab函数中,我想知道用户上次与Matlab GUI交互的时间。通过matlab GUI,我的意思是用户在命令窗口中输入或在编辑器中输入。

我希望实现的算法基本上是:

如果已经有一段时间了,该功能将不会抓住焦点,而是在后台运行。 如果用户最近进行了互动,可能他/她现在对结果感兴趣,并且该功能将抓住焦点。

1 个答案:

答案 0 :(得分:2)

这是一个艰难的!这是一个基于此undocumented codepersitent variables仅使用命令窗口执行所需操作的建议。

我使用了两个功能:CW_listenCW_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中搜索,则可能会发现该怎么做;)