我正在制作一个程序,它将一些数据发送到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任务并转移到后台任务。我没有得到我想要的东西。请帮忙。
答案 0 :(得分:0)
我必须使用Service,Task和CountDownLatch来完成此任务,正如我在问题更新部分中提到的那样。
另外,我必须在firstFunc中运行另一个任务,我在那里更新了进度。就像this回答一样。