【问题标题】:How to make multiple subscription on one ReceivePort dart如何在一个 ReceivePort dart 上进行多个订阅
【发布时间】:2021-11-20 02:47:28
【问题描述】:

我的任务是创建 N 个隔离区,以及一个将传递给这些隔离区的主 ReceivePort,通过使用此 ReceivePort,我传递了函数所需的所有信息,以提供理想的输出。它是第一次工作,但是,任何给这些隔离区的连续消息,并且接收它们都会引发这样的错误

这是我的代码

  //main receive port
  var controlPort = ReceivePort();

  ...
  class _MainScreenState extends State<MainScreen> {
  final ImagePicker _picker = ImagePicker();

  Future<ui.Image>? image;

  @override
  void initState() {
    for (int i = 0; i < Platform.numberOfProcessors; i++) {
      Future<Isolate> isolate =
          Isolate.spawn(Core.readAndMapFast, controlPort.sendPort);
    }
  }

  @override
  Widget build(BuildContext context) {

  ...
  static void readAndMapFast(SendPort sendPort) async {
    //sending SendPort of a created isolate to the main thread
    ReceivePort receivePort = ReceivePort();
    sendPort.send(receivePort.sendPort);

    receivePort.first.then((message) {
    //listening for a message coming from main thread and populating it with all needed 
    //data
      message as Arguments;
      Arguments arguments = Arguments(message.imgList, message.lutList,
          message.imgHeight, message.imgWidth, message.widthLut, message.order);
    //ecexuting all needed operations and after that sending message to the main thread
    ...
      sendPort.send(output);

    //in the main thread we are listening for messages from RecievePort we created at 
    //the very beginning

   await for (dynamic message in controlPort.asBroadcastStream()) {
      if (message is SendPort) {

   //waiting for a message from isolates and if its type is SendPort i.e isolate sending 
   //its first message we are sending needed arguments to a function

        message.send(args[i]);
      } else {
        message as FinalList;
        counter++;
        postEditList.add(message);
        if (counter == numberOfWorkers) {
          Stopwatch timerr = Stopwatch();
          timerr.start();
          for (int t = 0; t < postEditList.length; t++) {
            FinalList list =
                postEditList.where((element) => element.order == t).first;
            bytesBuilder.add(list.imgSubList);
          }
          break;
        }
      }
    }

我建议我必须使用 ReceivePort().asBroadcastStream(),但是我不能用它发送消息和做其他事情。因为变成stream之后,我们就没有SendPort了。

【问题讨论】:

    标签: flutter asynchronous stream dart-isolates


    【解决方案1】:

    我想出了解决办法。这很容易。我们有一个主要的 ReceivePort,我们将使用它来跨隔离区和主线程进行通信,并且我们还创建了一个 BroadcastStream,它将用于侦听来自我们的 ReceivePort 的任何更新。

    var controlPort = ReceivePort();
    var broadcastStream = controlPort.asBroadcastStream();
    

    那么你所要做的就是监听broadcastStream的更新而不是controlPort by

    broadcastStream.listen((event) {});
    

    希望对遇到同样问题的朋友有所帮助

    【讨论】:

      猜你喜欢
      • 2020-02-13
      • 1970-01-01
      • 2019-01-22
      • 2019-08-09
      • 1970-01-01
      • 2019-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多