【发布时间】:2015-12-19 22:14:47
【问题描述】:
我正在将一个 Swing 应用程序转换为 GWT,它大量使用了多线程。该代码在后台运行连续的数值模拟,并以图形方式显示每一帧的结果。模拟需要知道每次计算经过了多少真实时间。
摇摆
Thread calculate = new Thread(new Runnable(){
// run calculation cycles every 10 ms
// (or as fast as possible)
long prevT=System.currentTimeMillis();
while(!isFinished){
long currT = System.currentTimeMillis(),
dt = currT-prevT;
if(dt<10) Thread.sleep(5);
else{
simulate(dt);
prevT = currT;
}
}
}
// Update UI every 60 ms
java.awt.Timer timer = new Timer(60, new ActionListener(){public void actionPerformed(ActionEvent e){
results = getCurrentSimState();
uiPanel.render(results);
}});
此外,还有来自用户的事件驱动代码可以更改模拟器状态。
在 GWT 中实现此功能的最佳方式是什么?大多数以前的多线程问题主要与异步客户端-服务器工作有关。我看到了这个问题Threading in GWT (Client),我想知道Scheduler 是否合适:
GWT
void onLoad(){
AnimationScheduler.get().requestAnimationFrame(callback, uiElement);
}
AnimationCallback cb = new AnimationCallback(){public void execute(double t){
results = getCurrentSimState();
render(results, uiElement);
AnimationScheduler.get().requestAnimationFrame(callback, uiElement);
}};
double prevT=Duration.currentTimeMillis();
Scheduler.get().scheduleIncremental(new RepeatingCommand(){ public void execute() {
double currT = Duration.currentTimeMillis(),
dt = currT-prevT;
if(dt>30){
calculate(dt);
prevT = currT;
}
return isFinished;
}});
由于我是 GWT 的新手,我真的很想知道
- 这是一个可行的设计吗?从线程设计到事件驱动设计非常令人困惑。
- 我不知道哪一个可能“滴答”得更快。这两件事中的哪一个被优先考虑?
RepeatingCommand中的计算,还是AnimationScheduler中的GUI更新? - 这种设计有什么主要的注意事项吗?我不希望页面被锁定!我随意选择对两个线程使用不同的调度方式——对吗?如果是,为什么?
- 10 毫秒可能很快,但有没有办法猜测合理的计算速率是多少?模拟器越准确,更新速度越快。 (这是一个由 RK4 求解的刚性 PDE 系统!)
【问题讨论】:
标签: multithreading gwt