Как связаться с изолятом, выполняющим операцию блокировки в Dart / Flutter? - PullRequest
0 голосов
/ 26 апреля 2020

В работе для приложения-флаттера рабочего стола (linux) мне нужно выполнить несколько интенсивных вычислительных задач в изоляции. Но пока этот изолятор выполняет эту долгую операцию, он не читает входящие сообщения (что выглядит логически c). Я хотел бы иметь возможность общаться с ним во время его выступления.

  ReceivePort rPort;
  SendPort sPort;
  Isolate isolate;

void main() {
  rPort = ReceivePort();
  isolate = await Isolate.spawn(entryPoint, receivePort.sendPort);
  sPort = await rPort.first;
  sendMessage("perform"); // this is being processed
  sendMessage("controlMessage"); // this is being processed after the perform has ended
}

void sendMessage(String msg) {
  ReceivePort localReceivePort = ReceivePort();
  sendPort.send([msg, localReceivePort.sendPort]);
}

void entryPoint(SendPort sendPort)
{
 ReceivePort receivePort = ReceivePort();
 sendPort.send(receivePort.sendPort);

 receivePort.listen((message) {
   String data = msg[0];
   SendPort reply = msg[1];
   print(data);
   if(data == "perform") performBlockingOperation();
   else if(data == "controlMessage") controlPerformance();
   repy.send("something"); 
 });

}

Я испробовал много вариантов: сделать асинхронное выполнение executeBlockingOperation c, но, похоже, это не работает. Даже попытка создать собственный поток внутри изолята возвращает

.. / .. / third_party / dart / runtime / vm / runtime_entry. cc: 3331: ошибка: не удается вызвать собственный обратный вызов вне изолировать.

Есть ли способ достичь того, что я пытаюсь?

1 Ответ

1 голос
/ 26 апреля 2020

Выполнение асинхронных вычислений - это правильный первый шаг. Второй шаг - фактически дать контроль в некоторых точках во время вычислений.

Затем вставьте несколько await Future.delayed(Duration.zero); операторов в ваш код вычисления, который блокирует все остальное. Не слишком глубоко в вычислениях, потому что это вносит задержку, но достаточно часто, чтобы у вашего изолята была возможность периодически проверять наличие новых событий.

...