そこで、Java チェス エンジンのこのポートを開始し、今では分離株を使用して理解する必要があります。
私の最初の試みは非常に面倒でした。
A) エラーがどこにも表示されないため、isolate の外でコードをテストする必要がありました。
B) 最終的にテストを実行するようになったとき、Isolate からの出力がバッファリングされ、リアルタイムでコンソールに書き込まれないことに気付きました。
これは私の最初のテストで、現在は機能していますが、出力はバッファリングされ、分離が完了した後に書き込まれます...
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);
}