2012-04-03 68 views
13

事實:響應MATLAB GUI沒有調用的DrawNow()約MATLAB直接

  1. MATLAB的UI的Java Swing。
  2. MATLAB與Java具有良好的互操作性,可以初始化Java對象並直接從MATLAB代碼調用它們的方法,甚至可以將MATLAB定義的監聽器傳遞給Java!

我的問題:

MATLAB不提供後臺線程,這樣使MATLAB用戶界面響應我們必須調用函數drawnow其刷新搖擺EDT排隊,又見herehere。這是一個衆所周知的事實,迄今爲止非常好。

但是現在我有一個客戶,其執行計算的代碼是一個MATLAB p文件(加密的),所以我無法訪問代碼將drawnow放在那裏。

不成功的嘗試:

我嘗試加速旋轉定時器做主叫drawnow的工作,但它似乎沒有工作 - 定時器本身需要一個先例drawnow火的回調。

編輯:最後我在另一個線程上運行.NET/WPF實現GUI,所以它始終保持響應,看起來比原來的MATLAB好得多。

回答

2

只是一個想法。您可以使用Matlab builder for java從p文件構建一個jar文件。 從Java內部,你現在可以在一個單獨的線程中進行計算。

+0

這是一個非常醜陋的解決方案,但它可以工作。 **我必須先對它進行測試,然後才能評價它。 – Mikhail 2012-04-06 15:22:12

7

我不知道這是否可以正確完成。我從來沒有找到在mex文件的中間獲取drawnow效果的方法,我想這種情況是相似的。但是無論如何,這裏都是非常麻煩的黑客攻擊:D。如果你有一個p文件,你可以運行:

profile on; 
pfile(); 
profile viewer; 

並得到pfile()函數調用的功能。如果代碼正在調用任何內置函數(例如disp)或其源代碼的任何函數,則可以在該路徑的更上方創建自己的文件版本,該文件將由p文件調用,例如

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

這將每5秒鐘最多調用一次drawnow,儘管除非定期調用disp,否則它將不會有太大用處。如果你找不到內建的覆蓋,你可以使用任何其他功能,只需在頂部插入drawnow部分,如:

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

非常聰明!當我重寫(a)像'prime''這樣的'disp'(b)用戶自定義函數的內置函數時,可見性/優先級怎麼樣? – Mikhail 2012-04-07 18:24:22

+1

這很雜亂。我認爲總有一種方法可以專門引用一個函數(即使它是覆蓋),但我現在找不到它。據我瞭解,'path'確切地定義了哪些功能是可見的。除了內置函數外,其他的overriden函數似乎都不可訪問,其中'builtin(...)'允許您訪問它們。我認爲p-code-ness不會影響可見性/優先級:如果有一個名稱相同的函數在路徑的更上方,那麼它將具有優先級。 – Richante 2012-04-07 20:02:09