5

Java チェス エンジンをダーツに移植する方法を理解しようとしています。

したがって、Isolates を使用してエンジンを GUI と並行して実行する必要があることを理解しましたが、エンジンに強制的に検索を終了させるにはどうすればよいでしょうか。

Java では、エンジン スレッドと GUI スレッドの間で共有されるブール値を設定しました。

私が得た答え:

アイソレートにメッセージを送信して、停止するように指示する必要があります。次のようなことが簡単にできます。

port.send('停止');

私の要求

明確にしていただきありがとうございます。私が理解していないのは、port.send('THINK') コマンドが原因でチェス エンジンの分離がビジーである場合、port.send('STOP') コマンドにどのように応答できるかということです。

4

2 に答える 2

7

各分離はシングルスレッドです。あなたのプログラムが実行されている限り、他の誰もあなたの実行を妨害する手段を持ちません。

外部イベント (他の分離株からのメッセージを含む) に反応できるようにしたい場合は、長時間実行される実行を小さな部分に分割する必要があります。チェスエンジンはおそらく、次の動きを探す場所を知るための状態をすでに持っています (A* のようなもので構築されていると仮定します)。この場合、定期的に実行を中断し、最小限のタイムアウト後に再開することができます。

例:

var state;
var stopwatch = new Stopwatch()..run();
void longRunning() {
  while (true) {
    doSomeWorkThatUpdatesTheState();
    if (stopwatch.elapsedMilliseconds > 200) {
      stopwatch.reset();
      Timer.run(longRunning);
      return;
    }
  }
}
于 2013-05-11T00:25:27.680 に答える
2

新しい API には、

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

完全な例については、https://code.google.com/p/dart/issues/detail?id=21189#c4を参照してください。

于 2014-12-12T05:22:15.770 に答える