Flutter 飞镖/颤振:如何在无限循环中最好地处理硬件事件

Flutter 飞镖/颤振:如何在无限循环中最好地处理硬件事件,flutter,dart-async,dart-isolates,Flutter,Dart Async,Dart Isolates,我有一个无限循环,它在颤振应用程序中的异步函数中运行(尽管代码是纯Dart,但它没有使用颤振API) 基本上,它会处理一些数学方面的内容,但我希望能够使用来自硬件的事件(在本例中是通过麦克风)更新要处理的数据 为了给fastwhile(true)从外部获取事件的机会,我添加了一个持续时间为零的延迟 doStuff() async { while (!stopFlag) { processMathStuff(dataModifiedByHardwareCallback); /

我有一个无限循环,它在颤振应用程序中的异步函数中运行(尽管代码是纯Dart,但它没有使用颤振API)

基本上,它会处理一些数学方面的内容,但我希望能够使用来自硬件的事件(在本例中是通过麦克风)更新要处理的数据

为了给fast
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)


注意:如果我将代码移动到一个隔离区,如果
while(true)
缺少那种“产量”,我会遇到类似的问题,隔离区不监听发送端口的内容。

这是一个很难的尝试,但是你能将stopFlag变成一个流吗。谢谢。我没有很好地解释我自己:需要接收的不是那个标志,而是由“processMathStuff()表示的内容处理的信息。该信息的原始来源来自与硬件相关的回调。我可以在中间使用流,但是即使直接从CalpMathType注入回调也不会没有等待。延迟调用。@克里斯瑞诺兹,谢谢您的评论。为了使这一点更清楚,我修改了这个问题。事实上,在我尝试的其中一个实现中,要处理的数据来自流。我不知道流的效率,您也没有说为什么不喜欢该实现,但一种可能性是,您的硬件回调将项目放在一个流上,而您的stopflag也可以将消息放在同一个流上。然后您的while循环正在处理流。谢谢。我将尝试一个纯流实现,并看看它是如何运行的。这是一个大胆的尝试,但你能把stopFlag变成流吗。谢谢。我没有很好地解释我自己:需要接收的不是那个标志,而是由“processMathStuff()表示的内容处理的信息。该信息的原始来源来自与硬件相关的回调。我可以在中间使用流,但是即使直接从CalpMathType注入回调也不会没有等待。延迟调用。@克里斯瑞诺兹,谢谢您的评论。为了使这一点更清楚,我修改了这个问题。事实上,在我尝试的其中一个实现中,要处理的数据来自流。我不知道流的效率,您也没有说为什么不喜欢该实现,但一种可能性是,您的硬件回调将项目放在一个流上,而您的stopflag也可以将消息放在同一个流上。然后您的while循环正在处理流。谢谢。我将尝试一个纯流实现,看看它是如何运行的。