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

2022-09-04 22:25:55

关于 MATLAB 的事实:

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

我的问题:

MATLAB不提供后台线程,因此为了使MATLAB UI具有响应性,我们必须调用函数drawow来刷新Swing EDT队列,另请参阅此处此处。这是一个众所周知的事实,到目前为止一切顺利。

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

尝试失败:

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

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


答案 1

我不知道这是否能正确完成。我从来没有找到一种方法来获得在mex文件中间绘制的效果,我想这种情况是类似的。但无论如何,这是一个非常混乱的黑客:D。如果您有 p 文件,则可以运行:

profile on;
pfile();
profile viewer;

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

function disp(X)
  if (toc > 5)
    drawnow;
    tic;
  end
  builtin('disp', X);

这将每5秒调用一次drawow,尽管除非定期调用disp,否则它不会有太大用处。如果您找不到要覆盖的内置内容,则可以使用任何其他函数,只需在顶部插入 drawow 部分,例如:

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

答案 2

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


推荐