Matlab Compiler SDK plot waitforFigures函数多线程

Matlab Compiler SDK plot waitforFigures function multiple threads

我用 matlab 创建了一个简单的图,并用 matlab 编译器 sdk 创建了一个 java jar。

我可以 运行 由 matlab 创建的 java 函数并查看我的绘图。

我想创建多个绘图并在单独的线程中启动该函数。 有用。但是如果我启动我的 java 函数来创建多个图,第一个线程的 waitforFigure() 方法也在等待其他图关闭。所以我的第一个线程不会继续并阻塞,直到在它之后创建的其他地块也被关闭。

我想实例化 Java class 的对象,由 Matlab 编译器 SDK 生成,创建一个新的 Matlab 编译器 运行time?!。 为什么 waitforFigure 方法也在等待其他图,如果它是 运行 在单独的线程上?

这是我的函数 运行我创建的 RunAlgorithm class 的函数。 运行函数方法实例化了创建的 Matlab Compiler SDK Class,Class1。它是 class 的默认名称。 thePlot 函数是 Matlab 代码 运行ning 在 Matlab 运行 时间并绘制我的数据。

void runFunction( MWNumericArray x1, MWNumericArray y1, MWNumericArray z1) throws MWException {


Class1 thePlot = new Class1;

    /* Number of points to plot */
    try {


        /* Plot data */
    thePlot.runAlgorithm( x1, y1, z1);
    thePlot.waitForFigures();

    }

    catch (Exception e) {
        System.out.println("Exception: " + e.toString());
    }

    finally {
        /* Free native resources */
        MWArray.disposeArray(x1);
        MWArray.disposeArray(y1);
        MWArray.disposeArray(z1);
        if (thePlot != null)
            thePlot.dispose();
    }
}

这是我的简单线程,它如何执行包含我的 Matlab class 的函数。 我实例化 RunAlgorithm class,从文件中读取数据,并将其转换为 MWNumericArray 传递给 运行Function 方法。 在我的 运行Function 方法中有 waitforFigures 方法阻塞。

Thread t1=new Thread() {
           public void run() {


        RunAlgorithm a = new RunAlgorithm();
        RunAlgorithm.Measurements n = null;

        try {
            n= a.readFile(selectecValue);
            System.out.println("File REad");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {

            a.runFunction(n.mX, n.mY, n.mZ);
        } catch (MWException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
         }
            };
            t1.start();

基本上我读取了一个 csv 文件,将我的数据解析为 MWnumericArray,并将其传递给 RunAlgorithm class。 Class 在内部创建了具有 运行 函数的 Class1 对象并绘制了我的 Matlab- Plot with Matlab 运行time.

编辑:

如果我运行我申请了两次。 waitforFigure 方法只是在等待一个应用程序生成的线程。 这意味着,matlab 运行时间是 运行 一次与应用程序,独立于我创建的线程?

所以 Class1 实例化不是每次都启动一个新的 matlab 运行time 吗?

编辑: 如果我将我的 matlab 代码编译为 Singleton,那么我的情节就会刷新。这意味着,我的 Class1 对象的实例化正在启动一个新的 matlab 运行time ?

我查看了您的问题并尝试在我的机器上创建一个 Matlab jar。但是,由于某种原因,创建 jar 文件失败,因此我为 .net 应用程序创建了一个 dll。无论如何,基本原理应该是相似的。

这是在生成的 C# 代码中找到的构造函数的快照:

private static MWMCR mcr= null;
static Plotter()
{
  if (MWMCR.MCRAppInitialized)
  {
    try
    {
      /* a lot of codes here but deleted to make what is important stands out */
      mcr= new MWMCR("",
                     ctfFilePath, embeddedCtfStream, true);
    }
    catch(Exception ex) { //some code here }
  }
}

public Plotter()
{
  if(ex_ != null)
  {
    throw ex_;
  }
} 

drawplot() 方法告诉 Matlab 运行时间到 运行 打包的 M 脚本。

public void drawplot()
{
  mcr.EvaluateFunction(0, "drawplot", new MWArray[]{});
}

如您所见,MWMCR class 是 运行 M 脚本的实际 Matlab 实例,它是一个静态对象。因此,无论实例化多少个PlotterClass1,Matlab实例都只有一个。多个mcr.EvaluateFunction个请求一个接一个排队执行。因此,理论上 运行如果不生成两个 MWMCR 对象就不可能同时运行多个 Matlab 脚本,这意味着您将需要 java 程序集的多个实例(实验证实).


在您的例子中,所有图形均由同一 MWMCR 实例绘制,WaitForFiguresToDiewaitForFigures() 检查 MWMCR 绘制的任何未封闭图形。

public void WaitForFiguresToDie()
{
    mcr.WaitForFiguresToDie();
}

我可以向您建议的一个解决方案是在您的 jar 包中包含一个空的 Matlab 代码 (EmptyCode())。然后在您的 java 代码中实现类似于以下内容的内容:

void runFunction()
{
    Class1 thePlot = new Class1;
    Thread t1=new Thread() {
       public void run() {
           Class1 thePlot = new Class1;
           thePlot.waitForFigures();
           }
    }
    Thread t2=new Thread() {
       public void run() {
           Class1 thePlot = new Class1;
           thePlot.waitForFigures();
           }
    }
    thePlot.waitForFigures();
    t1.start();
    t2.start();

    //your java code

    thePlot.EmptyCode();
    thePlot.waitForFigures();
}