【问题标题】:How to terminate a long running isolate #2如何终止长时间运行的隔离 #2
【发布时间】:2013-05-10 23:25:27
【问题描述】:

我正在尝试了解如何将我的 Java 国际象棋引擎移植到飞镖。

所以我明白我应该使用 Isolates 来让我的引擎与 GUI 并行运行,但我怎样才能强制引擎终止搜索。

在 java 中,我只是设置了一些在引擎线程和 gui 线程之间共享的布尔值。

我得到的答案:

您应该向隔离者发送消息,告诉它停止。您可以简单地执行以下操作:

port.send('STOP');

我的请求

感谢您的澄清。我不明白的是,如果国际象棋引擎隔离由于 port.send('THINK') 命令而忙碌,它如何响应 port.send('STOP') 命令

【问题讨论】:

  • 它是否正常工作,您只是想了解底层进程,还是无法让它响应“STOP”命令?

标签: dart dart-isolates


【解决方案1】:

每个隔离都是单线程的。只要您的程序正在运行,其他人就无法干扰您的执行。

如果您希望能够对外部事件(包括来自其他隔离区的消息)做出反应,您需要将长期运行的执行拆分为更小的部分。国际象棋引擎可能已经有某种状态来知道下一步该在哪里寻找(假设它是用 A* 之类的东西构建的)。在这种情况下,您可以定期中断执行并在最短超时后恢复。

例子:

var state;
var stopwatch = new Stopwatch()..run();
void longRunning() {
  while (true) {
    doSomeWorkThatUpdatesTheState();
    if (stopwatch.elapsedMilliseconds > 200) {
      stopwatch.reset();
      Timer.run(longRunning);
      return;
    }
  }
}

【讨论】:

    【解决方案2】:

    新的 API 将包含一个

    isolate.kill(loopForever ? Isolate.IMMEDIATE : Isolate.AS_EVENT); 
    

    有关完整示例,请参阅 https://code.google.com/p/dart/issues/detail?id=21189#c4

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多