Dart / Flutter: Как лучше всего обрабатывать аппаратные события в бесконечном цикле - PullRequest
0 голосов
/ 03 октября 2019

У меня есть бесконечный цикл, который выполняется в асинхронной функции в приложении Flutter (хотя код чистый Dart, на нем не используется API Flutter).

По сути, он обрабатывает некоторые математические вещи,но я хочу иметь возможность обновлять данные для обработки с помощью события, поступающего от оборудования (в данном конкретном случае от микрофона).

Для того, чтобы быстрый while(true) имел возможность получать события отСнаружи я добавил задержку с длительностью ноль.

doStuff() async {
  while (!stopFlag) {
    processMathStuff(dataModifiedByHardwareCallback);

    // Without this, the loop can't be interrupted.
    await Future.delayed(Duration.zero);
  }
}

И хотя, похоже, это работает на большинстве платформ, вызов Future.delayed делает этот цикл намного медленнее, чем хотелось бы. Вопрос в том, есть ли лучший (более быстрый) способ сделать это. Это даже выглядит для меня как взлом. Я пытался вызывать Future.delayed только каждые определенное количество итераций, но, делая это так часто, как каждые 10 итераций, система теряет события.

Кстати, processMathStuff не содержит внутренних циклов, поэтомуэто действительно O (1).

ПРИМЕЧАНИЕ: Если я переместлю код в Isolate, у меня возникнет аналогичная проблема с Isolate, не слушающим материал sendPort, если while(true)не хватает такого рода «доходности».

...