flutter - 如何与 Dart/Flutter 中执行阻塞操作的isolate进行通信?

标签 flutter dart dart-isolates

在桌面flutter应用程序(linux)的工作中,我需要在隔离中执行一些密集的计算任务。但是,虽然这个隔离正在执行这么长的操作,但它并没有读取传入的消息(这似乎是合乎逻辑的)。 我希望在它表演时仍然能够与它交流。

  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"); 
 });

}

我尝试了很多选项:使 PerformBlockingOperation 异步,但这似乎不起作用。 即使尝试在隔离返回内创建 native 线程

../../third_party/dart/runtime/vm/runtime_entry.cc: 3331: error: Cannot invoke native callback outside an isolate.

有办法实现我正在尝试的目标吗?

最佳答案

使计算异步是正确的第一步。 第二步是在计算过程中的某些点实际放弃控制。

然后在计算代码中插入一些 await Future.delayed(Duration.zero); 语句,该语句会阻塞其他所有内容。计算不要太深入,因为它确实会引入延迟,但通常足以使您的隔离有机会偶尔检查新事件。

关于flutter - 如何与 Dart/Flutter 中执行阻塞操作的isolate进行通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61436422/

相关文章:

visual-studio-code - Visual Studio Code : dart not found

flutter - 当我们可以在第一行代码中初始化一个变量时,为什么要在 flutter 中使用 initState()

dart - 隔离代码未按预期工作

dart - spawnUri()与 “https”

Dart 程序没有退出

flutter - 无法从方法 'Null' 返回类型为 'onGenerateRoute' 的值,因为它的返回类型为 'Route<dynamic>'

ios - Flutter 版本构建从终端失败

https - Dart/Redstone - HTTPS 连接

flutter - 我正在尝试制作一个 flutter 的应用程序来控制我的Philips Hue灯,但是hue_dart遇到问题

flutter - 错误 : SliverGeometry has a paintOffset that exceeds the remainingPaintExtent from the constraints