如何终止长期运行的隔离#2

时间:2013-05-10 23:25:27

标签: dart

我试图理解如何将我的Java国际象棋引擎移植到飞镖。

所以我明白我应该使用Isolates与GUI并行运行我的引擎但是如何强制引擎终止搜索。

在java中我只是设置了一些boolean,它在引擎线程和gui线程之间共享。

我得到了答案:

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

port.send( 'STOP');

我的要求

感谢您的澄清。我不明白的是,如果因为port.send('THINK')命令棋机引擎隔离,它如何响应port.send('STOP')命令

2 个答案:

答案 0 :(得分:7)

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

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

示例:

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

答案 1 :(得分:2)

新API将包含

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

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