У меня есть бесконечный цикл, который выполняется в асинхронной функции в приложении 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)
не хватает такого рода «доходности».