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 回答。
我正在制作一个程序,它可以将一些数据发送到 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 回答。