响应式MATLAB GUI,无需直接调用drawow()

Mik*_*ail 13 java matlab user-interface swing

关于MATLAB的事实:

  1. MATLAB UI是Java Swing.
  2. MATLAB与Java具有出色的互操作性,可以初始化Java对象并直接从MATLAB代码调用它们的方法,甚至可以将MATLAB定义的监听器传递给Java!

我的问题:

MATLAB不提供后台线程,因此为了使MATLAB UI响应,我们必须调用刷新Swing EDT队列的函数drawow,也可以在这里这里看到.这是一个众所周知的事实,到目前为止一直很好.

但是现在我有一个客户,其执行计算的代码是一个MATLAB p文件(加密),因此我无法访问代码drawnow.

不成功的尝试:

我尝试使用计时器来完成调用的工作,drawnow但它似乎不起作用 - 计时器本身需要一个先例drawnow来触发它的回调.

编辑:最后我实现了GUI与.NET/WPF在另一个线程上运行,因此它始终响应并且看起来比原始MATLAB好得多.

Ric*_*nte 7

我不知道这是否可以正常完成.我从未找到过在mex文件中间获得drawow效果的方法,我猜这种情况类似.但无论如何,这里是一个令人难以置信的混乱黑客:D.如果你有一个p文件,你可以运行:

profile on;
pfile();
profile viewer;
Run Code Online (Sandbox Code Playgroud)

并了解pfile()正在调用的函数.如果代码调用任何内置函数(例如disp)或您可以访问其源代码的任何函数,则可以在路径的更上方创建自己的文件版本,该文件将由p文件调用,例如

function disp(X)
  if (toc > 5)
    drawnow;
    tic;
  end
  builtin('disp', X);
Run Code Online (Sandbox Code Playgroud)

这将最多每5秒调用一次drawow,尽管除非定期调用disp,否则它将没有多大用处.如果你找不到要覆盖的内置,你可以使用任何其他功能,只需在顶部插入drawow部分,如:

function primes(N)
  if (toc > 5)
    drawnow;
    tic;
  end
  The rest of the original primes.m here.
Run Code Online (Sandbox Code Playgroud)


bde*_*caf 2

只是一个想法。您可以使用 Matlab builder for java 从 p 文件构建 jar 文件。现在,您可以在 Java 内部的单独线程中进行计算。