2017-05-05 79 views
0

我目前有一個Matlab應用程序接收來自另一個外部應用程序(以JAVA編碼)的請求。與Matlab異步執行

Java應用程序使用Yair Atlman的'Undocumented Matlab'中描述的系統通知matlab。我們可以通知Matlab各種操作,將它們命名爲A和B,這會觸發不同的回調。

問題如下:在某些情況下,Java應用程序可能會在處理第一個通知之前發送新的通知。在一個理想的世界,這裏是我想發生什麼:

  • Matlab的接收
  • Matlab的開始執行回調
  • Matlab的接收到B
  • Matlab的持有回調B和繼續執行回調
  • Matlab的執行回調乙

這裏就是發生:

  • Matlab的接收
  • Matlab的開始執行回調
  • Matlab的接收乙
  • Matlab的暫停回調甲
  • Matlab的執行回調乙
  • Matlab的完成回調

我試圖幾種可能的解決方案,但都失敗了,我終於設法找到一個奇怪的解決方法,但是這個解決方法來與問題和我必須擺脫它。我無法訪問並行計算。 我的嘗試涉及將收到的操作存儲在靜態隊列中並鎖定回調執行,但由於A永遠不會被清除,所以它會在無限循環中結束。

由於B實際上可能需要A生成的數據,所以完美的解決方案實際上是Java持有B通知,直到它從Matlab接收到「完整」通知。我也嘗試在這裏使用並行性,但Matlab暫停執行,Java從未收到通知並永遠睡眠......

在這一點上,我願意採取任何解決方法,因爲我完全無能爲力的解決方案。

感謝

PS:兩個MATLAB 2011B和2014B必須努力

回答

0
利用Matlab控制,一個框架,允許您直接與Matlab的通信,而同時避免了大部分潛在的死鎖的

找到解決方案問題:

https://code.google.com/archive/p/matlabcontrol/

這裏是類實現我提出使用該框架適合我的需要(許多其他用途是可能的):

package framework.matlab.events; 

import matlabcontrol.MatlabConnectionException; 
import matlabcontrol.MatlabInvocationException; 
import matlabcontrol.MatlabProxy; 
import matlabcontrol.MatlabProxyFactory; 
import matlabcontrol.MatlabProxyFactoryOptions; 

public class MatlabEvent { 

    private String  mMethodName; 
    private int   mMethodOutputs; 
    private MatlabProxy mProxy; 

    public void setMethodParameters(String iMethodName, int iMethodOuputs) { 
     mMethodName  = iMethodName; 
     mMethodOutputs = iMethodOuputs;   
    } 

    public void callMatlabMethod(Object ... obj) { 

     connect(); 

     try { 
      mProxy.returningFeval(mMethodName, mMethodOutputs, obj);  
     } catch (MatlabInvocationException e) { 
      e.printStackTrace(); 
     } 
     finally { 
      disconnect(); 
     } 
    } 

    private void connect() { 

     MatlabProxyFactoryOptions options = new MatlabProxyFactoryOptions.Builder() 
       .setUsePreviouslyControlledSession(true) 
       .build(); 

     MatlabProxyFactory factory = new MatlabProxyFactory(options);  

     try { 
      mProxy = factory.getProxy(); 
     } catch (MatlabConnectionException e) { 
      e.printStackTrace(); 
     } 

    } 

    private void disconnect() { 
     if (null != mProxy) { 
      mProxy.disconnect(); 
     } 
    } 
} 

因此,我不再使用由Yair Altman創建的Matlab通知系統。