Java Matlab编译器SDK plot waitforFigures函数多线程

Java Matlab编译器SDK plot waitforFigures函数多线程,java,matlab,matlab-figure,matlab-deployment,matlab-compiler,Java,Matlab,Matlab Figure,Matlab Deployment,Matlab Compiler,我用matlab创建了一个简单的绘图,并用matlab编译器sdk创建了一个java jar 我可以运行matlab创建的java函数并查看我的绘图 我想创建多个绘图,并在单独的线程中启动该函数。 它起作用了。但是如果我启动java函数来创建多个绘图,第一个线程的waitforFigure()方法也会等待其他绘图关闭。因此,我的第一个线程不会继续并阻塞,直到它之后创建的其他绘图也关闭 我认为实例化由Matlab编译器SDK生成的Java类的对象会创建一个新的Matlab编译器运行时?!。 如果w

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

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

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

我认为实例化由Matlab编译器SDK生成的Java类的对象会创建一个新的Matlab编译器运行时?!。 如果waitforFigure方法在单独的线程上运行,为什么还要等待其他绘图呢

这是我创建的RunAlgorithm类的函数runFunction。 runFunction方法实例化Matlab编译器SDK创建的类Class1。它是类的默认名称。thePlot函数是在matlab运行时运行的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类的函数。 我实例化RunAlgorithm类,从文件中读取数据,并将转换为MWNumericArray的数据传递给runFunction方法。 在我的runFunction方法中有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类。该类使用runFunction在内部创建Class1对象,并使用Matlab运行时绘制我的Matlab-Plot

编辑:

如果我运行两次应用程序。waitforFigure方法正在等待一个应用程序生成的线程。 这意味着,matlab运行时与应用程序一起运行一次,与我创建的线程无关

那么Class1实例化不是每次都启动一个新的matlab运行时吗

编辑:
如果我将matlab代码编译为Singleton,那么我的绘图就会刷新。这意味着,我的Class1对象的安装正在启动一个新的matlab运行时?

我研究了您的问题,并试图在我的机器上创建一个matlab jar。然而,由于某种原因,创建jar文件失败了,所以我为.net应用程序创建了一个dll。无论如何,基本原则应该是类似的

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

还有
drawplot()
方法,它告诉Matlab运行时运行打包的M脚本

public void drawplot()
{
  mcr.EvaluateFunction(0, "drawplot", new MWArray[]{});
}
如您所见,MWMCR类是运行M脚本的实际Matlab实例,它是一个静态对象。因此,无论实例化了多少个
绘图仪
Class1
,都只有一个Matlab实例。多个
mcr.EvaluateFunction
请求排队并逐个执行。因此,从理论上讲,如果不生成两个MWMCR对象,就不可能同时运行多个Matlab脚本,这意味着您将需要java程序集的多个实例(实验确认的


在您的情况下,所有地物都由同一个MWMCR实例绘制,并且
WaitForFiguresToDie
waitForFigures()
检查由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();
}

我只是想知道我是否已经解决了你的问题。不是完全解决了。在我看来,这似乎是一个黑客,而不是一个正确的解决方案
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();
}