1

所以我启动了我的 java 国际象棋引擎的这个端口,现在我需要使用和理解隔离。

我的第一次尝试非常麻烦。

A)我不得不尝试在隔离之外测试代码,因为错误在任何地方都没有显示。

B)当我最终运行测试时,我注意到来自隔离的输出被缓冲而不是实时写入控制台。

这是我的第一个测试,现在可以工作,但是在隔离完成后输出被缓冲和写入......

library chessbuddy;

import 'dart:isolate';

void main() {
//  slowPrime();
//  fastPrime();

  var port = new ReceivePort();

  spawnFunction(slowPrime, errorHandler);
  spawnFunction(fastPrime, errorHandler);
}

bool errorHandler(IsolateUnhandledException e) {
  print(e);
  return true;
}

void fastPrime() {
  int prime = 1;
  DateTime started = new DateTime.now();

  // -- Run for 10 seconds --
  int secs = secondsSince(started);
  int lastSecs = secs;
  while (secs <= 10) {
    if (secs != lastSecs) {
      print("$secs: Fast method reached prime $prime");
      lastSecs = secs;
    }
    prime = nextPrimeFast(prime);
    secs = secondsSince(started);
  }
}

void slowPrime() {
  int prime = 1;
  DateTime started = new DateTime.now();

  // -- Run for 10 seconds --
  int secs = secondsSince(started);
  int lastSecs = secs;
  while (secs <= 10) {
    if (secs != lastSecs) {
      print("$secs: Slow method reached prime $prime");
      lastSecs = secs;
    }
    prime = nextPrimeSlow(prime);
    secs = secondsSince(started);
  }
}

int secondsSince(DateTime since) {
  DateTime now = new DateTime.now();
  return now.difference(since).inSeconds;
}


bool isPrimeSlow(int n) {
  for (int i = 2; i < n; i++) {
    if (n % i == 0)
      return false;
  }
  return true;
}

int nextPrimeSlow(int from) {
  while (!isPrimeSlow(++from));
  return from;
}

bool isPrimeFast(int n) {
  for (int i = 2; 2 * i < n; i++) {
    if (n % i == 0)
      return false;
  }
  return true;
}

int nextPrimeFast(int from) {
  while (!isPrimeFast(++from));
  return from;
}

这是另一个带有子进程的测试,该子进程接收命令和答案。这个可行,现在我想我知道该怎么做了。

问题!如何检查隔离物是否还活着?我在 SendPort 中找不到任何方法。

library chesbuddy;

import 'dart:isolate';

void main() {
  try {
    port.receive((var message, SendPort replyTo) {
      print("Got answer: $message");
      // port.close();
    });

    SendPort subProcess = spawnFunction(process, errorHandler);
    subProcess.send(["echo", "svinhuvud"], port.toSendPort());
    subProcess.send(["think", "fenpos"], port.toSendPort());
    subProcess.send(["fib", 20], port.toSendPort());
    subProcess.send(["throw"], port.toSendPort());
    subProcess.send(["close"]);
    subProcess.send(["echo", "svinhuvud"], port.toSendPort());

  } catch (e) {
    print("Caugh an error: $e");
  }

}

process() {
  port.receive((var message, SendPort replyTo) {
    String command = message[0];
    print ("Got command: $command");

    if (command == "echo") {
      String txt = message[1];
      replyTo.send("echo: $txt");
      return;
    }

    if (command == "throw") {
      throw new StateError("APA GRIS KATT");
      return;
    }


    if (command == "fib") {
      int index = message[1];
      print("index = $index");
      int answer = fib(index);
      print("answer = $answer");
      replyTo.send("fib($index) = $answer");
      return;
    }

    if (command == "close") {
      port.close();
      return;
    }

    replyTo.send("Unknown command: $command");
  });
}

bool errorHandler(IsolateUnhandledException e) {
  print(e);
  return true;
}


int fib(i) {
  if (i < 2) 
    return i;
  else
    return fib(i-2) + fib(i-1);
}
4

0 回答 0