3

if I send message from one isolate to the main one, the main can't receive the full message. my test code is blew:

import 'package:flutter/material.dart';
import 'dart:isolate';
import 'dart:async';

void main() {
  init();
  runApp(MyApp());
}

void test(SendPort port) {
  var cnt = 1;
  Timer.periodic(new Duration(microseconds: 10), (Timer timer){
    port.send(cnt++);
  });
}

void init() {
  ReceivePort port = new ReceivePort();
  print("create an isoalte...");
  Isolate.spawn(test, port.sendPort);
  port.listen((msg){
    print("the return is: $msg");
  });
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(

        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {

    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(

        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.display1,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

if I send the message per seconds, it is ok, so the frequency will impact the main isolate receive message, if the main isoalte is busy, it will drop messages? does the port use the message queue to communication with each other? it is sync or async?

ping.wu
  • 31
  • 3

1 Answers1

1

The port communication uses the message queue and receives events asynchronously. If the running code doesn't return to the event loop, the isolate will not handle any incoming messages. It should still receive all the messages and buffer them until there is time for the handler to be called.

lrn
  • 64,680
  • 7
  • 105
  • 121