【问题标题】:GWT client side multithreading revisited重新审视 GWT 客户端多线程
【发布时间】: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 的新手,我真的很想知道

  1. 这是一个可行的设计吗?从线程设计到事件驱动设计非常令人困惑。
  2. 我不知道哪一个可能“滴答”得更快。这两件事中的哪一个被优先考虑? RepeatingCommand中的计算,还是AnimationScheduler中的GUI更新?
  3. 这种设计有什么主要的注意事项吗?我不希望页面被锁定!我随意选择对两个线程使用不同的调度方式——对吗?如果是,为什么?
  4. 10 毫秒可能很快,但有没有办法猜测合理的计算速率是多少?模拟器越准确,更新速度越快。 (这是一个由 RK4 求解的刚性 PDE 系统!)

【问题讨论】:

    标签: multithreading gwt


    【解决方案1】:

    您可能需要考虑使用 Web Workers 的真实后台处理,而不是使用调度程序“模拟”多线程。

    请注意,使用调度程序中的增量命令,您必须在工作完成时返回“false”,或者在需要继续时返回“true”。只有当您可以将计算分成小块,然后将控制权交还给可以执行用户操作的块之间的 JavaScript 时,此命令才会起作用。

    如果您不能将工作分成小块,那么使用调度程序的方法只有在每个计算周期所花费的时间少于计算之间的间隔时才有效,从而使 JavaScript 有机会在计算之间对用户活动做出反应。

    【讨论】:

    • 谢谢 - 网络工作者正是我所需要的,我以前没有遇到过这些。我最终遇到了谷歌代码WebWorker链接器,它似乎完全符合我的需要。
    猜你喜欢
    • 2011-02-05
    • 2011-01-26
    • 2010-11-25
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 2017-07-17
    相关资源
    最近更新 更多