【问题标题】:Responsive MATLAB GUI without calling drawnow() directly响应式 MATLAB GUI,无需直接调用 drawow()
【发布时间】:2012-04-17 11:24:54
【问题描述】:

关于 MATLAB 的事实:

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

我的问题:

MATLAB 不提供后台线程,因此要使 MATLAB UI 响应,我们必须调用函数 drawnow 来刷新 Swing EDT 队列,另请参见 herehere。这是一个众所周知的事实,到目前为止还不错。

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

尝试失败:

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

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

【问题讨论】:

    标签: java swing matlab user-interface


    【解决方案1】:

    我不知道这是否可以正确完成。我从来没有找到在 mex 文件中间获得 drawow 效果的方法,我猜这种情况是相似的。但无论如何,这是一个非常混乱的黑客: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.
    

    【讨论】:

    • 非常聪明!当我覆盖 (a) 像 disp 这样的内置函数 (b) 像 primes 这样的用户定义函数时,可见性/优先级如何,这可能是 p 编码本身?
    • 很乱。我认为总有一种方法可以专门引用一个函数(即使它被覆盖),但我现在找不到它。据我了解,path 准确定义了哪些功能是可见的。似乎无法访问任何其他覆盖的函数,除了内置函数,builtin(...) 允许您访问它们。我不认为 p-coded-ness 会影响可见性/优先级:如果在路径的更远处有一个同名的函数,那么它将具有优先级。
    【解决方案2】:

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

    【讨论】:

    • 这是一个非常丑陋的解决方案,但它可以工作。 我必须先对其进行测试,然后才能对其进行评分
    猜你喜欢
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 2014-09-05
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多