Java Java 打开 Matlab 时 FX 应用程序卡住

Java FX application stuck when Java opens Matlab

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

问题

点击JavaFX应用按钮提交数据后,matlabcontrol打开Matlab进行进一步计算。但是当java打开matlab时,JavaFX应用卡在等待状态cursor.Then在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问题中所述,我确实将服务和任务与倒计时锁一起使用。但是还是没有得到我想要的。在那里,

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();

latch await 并让后台工作继续进行。但就我而言,我的 FX 应用程序显示了一个进度条。因此它应该在后台任务发生时始终更新。在这里,它完成 FX 任务并转到后台任务。我没有得到我想要的。请帮助。

我不得不使用 Service、Task 和 CountDownLatch 来完成这个任务,正如我在问题更新部分提到的那样。

另外,我不得不 运行 firstFunc 中的另一个任务,我在那里更新了进度。喜欢 this 回答。