【问题标题】:How to implement a non-blocking Timer with GWT如何使用 GWT 实现非阻塞定时器
【发布时间】:2012-10-30 16:52:29
【问题描述】:

我有这个现有的定时器功能:

            final Timer waveTimer = new Timer() {
                @Override
                public void run() { 
                    double value = r.getByte(); // takes quite long to finish
                    wave.renderWaveOnFly(value);
            }};
            waveTimer.scheduleRepeating(50);

不管它如何工作,用户界面被“阻止”并且用户无法在用户界面中单击并执行任何操作,直到当部分用户界面调用waveTimer.cancel() 时,我创建了另一个定时器,该定时器在 10 点后取消此定时器秒,所以 UI 在那之前是不可用的。

有没有办法实现一个非阻塞计时器,让它暂停一段时间,也许只是为了确保 UI 没有被阻塞,并且用户仍然可以在 UI 中执行某些操作。

我的意思是,仍然感觉 UI 仍然是响应式的。

我不确定这个数字,但是说它每 100 毫秒停止一次,然后让位于 UI 并在暂停或类似的情况后恢复 100 毫秒。我正在考虑用什么方法来处理。

【问题讨论】:

  • 不应在 UI 线程中执行任何昂贵的操作!为此使用单独的线程。或者,如果无法绕过 ti,则显示“正在加载...”/“请稍候...”屏幕,最好是带有进度指示器。
  • @ppeterka 我希望我能做到,但我的应用程序的功能是从它从 flash 对象(当然用 javascript 包装)获得的实时字节中渲染一个波形
  • 你使用的Timer的包装是什么?

标签: gwt


【解决方案1】:

在浏览器的 UI 线程之外进行计算的唯一方法是使用 WebWorkers。但是在 GWT 中没有使用它们的工具:worker 代码需要专门的 GWT 链接器,并且只能通过 JSNI 创建 WebWorker。

仅供参考,SpeedTracer 使用 WebWorkers。

【讨论】:

    【解决方案2】:

    你能把 getBytes() 方法改成异步调用吗?那么 UI 不应该挂起等待方法完成。

    【讨论】:

      猜你喜欢
      • 2019-05-31
      • 2016-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-12
      • 1970-01-01
      • 2013-08-22
      • 1970-01-01
      相关资源
      最近更新 更多