Java打开Matlab时Java FX应用程序停滞不前

时间:2018-04-07 18:01:12

标签: java matlab matlabcontrol

我正在制作一个程序,它将一些数据发送到Matlab并从matlab接收输出。为此,我使用了matlabcontrol库。

问题

点击Java FX应用程序按钮提交数据后,matlabcontrol打开Matlab进行进一步计算。但是当java打开matlab时,Java FX应用程序会停留等待光标。然后在Matlab完成计算过程后再次开始工作。

我做了什么

public void runner()
{
    Platform.runLater(new Runnable()
    {
        @Override
        public void run()
        {
            firstFunc();
        }
    });

    Platform.runLater(new Runnable()
    {
        @Override
        public void run()
        {
            secondFunc();
        }                
    }); 
}

public void firstFunc()
{
// This function controls UI while Matlab does it's calculations
    double progress = 0.2;
    progressLabel.setText(progress*100+"% Completed");
    progressBar.setProgress(progress);

}

public void secondFunc()
{
// This method creates matlab connection and handle matlab
    firstClass mainFunc = new firstClass(pathSelected);
    mainFunc.func();
}

所以我使用Platform runLater分别运行两个方法。但是当Matlab开始运行时,我的程序仍然停留在等待光标上。 我还使用线程并行运行这些函数。但是有同样的问题。我怎么能纠正这个。有帮助吗?

更新

this问题所述,我确实使用了服务和任务与countdownlatch。但仍然没有得到我想要的。在那里,

Service<Void> service = new Service<Void>() {
    @Override
    protected Task<Void> createTask() {
        return new Task<Void>() {           
            @Override
            protected Void call() throws Exception {
                //Background work                       
                final CountDownLatch latch = new CountDownLatch(1);
                Platform.runLater(new Runnable() {                          
                    @Override
                    public void run() {
                        try{
                            //FX Stuff done here
                            firstFunc();
                        }finally{
                            latch.countDown();
                        }
                    }
                });
                latch.await();                      
                //Keep with the background work
                // I added matlab calling function here.
                secondFunc();
                return null;
            }
        };
    }
};
service.start();
锁定等待让后台工作进行。但就我而言,我的FX应用程序显示了一个进度条。因此它应该在后台任务发生时始终更新。在这里,它完成FX任务并转移到后台任务。我没有得到我想要的东西。请帮忙。

1 个答案:

答案 0 :(得分:0)

我必须使用Service,Task和CountDownLatch来完成此任务,正如我在问题更新部分中提到的那样。

另外,我必须在firstFunc中运行另一个任务,我在那里更新了进度。就像this回答一样。