所以我启动了我的 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);
}