如何获得间隔不均匀的飞镖流?
How do I get a dart Stream with uneven intervals?
我是 dart 和 Flutter 的新手,很想就我面临的算法问题获得一些建议。
我想将我的 Flutter 应用程序连接到蓝牙设备(该部分已完成,我已经连接)并以不均匀的间隔发送消息。我有一个列表中的消息,对于每条消息,我都知道我想在什么时间(毫秒)发送消息。
因此假设排列了以下消息:
start
在 0 毫秒
init_app
在 100 毫秒时
user_pick_x
在 500 毫秒时
user_start_x
500ms(user_pick_x
后发送,保证顺序)
interrupt
在 3500 毫秒时
我找到了创建流的文档,但它总是谈论单个间隔值。 https://dart.dev/articles/libraries/creating-streams.
想法:
- 从技术上讲,我可以传入
Duration
个对象的列表并使用自定义生成器 async*
,以及消息字符串。
- 或者,我可以将间隔设置为最低时间增量,并检查每个是否应发送一条消息。在示例的情况下,每 100 毫秒一次。
如果能暂停/取消直播就好了。这是流本身可以做的事情。
我认为最简单的方法是按指定的时间间隔发出这些消息。类似于:
Future<void> _wait(int milliseconds) async =>
await Future<void>.delayed(Duration(milliseconds: milliseconds));
Stream<String> generateMessages() async* {
yield 'start';
await _wait(100);
yield 'init_all';
await _wait(400);
yield 'user_pick_x';
yield 'user_start_x';
await _wait(3000);
yield 'interrupt';
}
void main() {
generateMessages().listen((msg) {
print('${DateTime.now()}: $msg');
});
}
这将打印:
2021-07-25 10:21:21.429: start
2021-07-25 10:21:21.531: init_all
2021-07-25 10:21:21.934: user_pick_x
2021-07-25 10:21:21.934: user_start_x
2021-07-25 10:21:24.938: interrupt
如果你想确保流的侦听器异步接收事件 - 因此不干扰等待毫秒,你可以显式使用 StreamController
默认情况下异步调用侦听器(确保import dart:async --- dart:io 仅在 sleep
的示例中使用,以表明即使在阻塞操作中它也会 运行 与等待并行):
import 'dart:async';
import 'dart:io';
Future<void> _wait(int milliseconds) async {
print('WAIT $milliseconds ms');
await Future<void>.delayed(Duration(milliseconds: milliseconds));
}
Stream<String> generateMessages() {
final controller = StreamController<String>(sync: false);
controller.onListen = () async {
controller.add('start');
await _wait(100);
controller.add('init_all');
await _wait(400);
controller.add('user_pick_x');
controller.add('user_start_x');
await _wait(3000);
controller.add('interrupt');
};
return controller.stream;
}
void main() {
generateMessages().listen((msg) {
sleep(const Duration(milliseconds: 120));
print('${DateTime.now()}: $msg');
});
}
我是 dart 和 Flutter 的新手,很想就我面临的算法问题获得一些建议。
我想将我的 Flutter 应用程序连接到蓝牙设备(该部分已完成,我已经连接)并以不均匀的间隔发送消息。我有一个列表中的消息,对于每条消息,我都知道我想在什么时间(毫秒)发送消息。
因此假设排列了以下消息:
start
在 0 毫秒init_app
在 100 毫秒时user_pick_x
在 500 毫秒时user_start_x
500ms(user_pick_x
后发送,保证顺序)interrupt
在 3500 毫秒时
我找到了创建流的文档,但它总是谈论单个间隔值。 https://dart.dev/articles/libraries/creating-streams.
想法:
- 从技术上讲,我可以传入
Duration
个对象的列表并使用自定义生成器async*
,以及消息字符串。 - 或者,我可以将间隔设置为最低时间增量,并检查每个是否应发送一条消息。在示例的情况下,每 100 毫秒一次。
如果能暂停/取消直播就好了。这是流本身可以做的事情。
我认为最简单的方法是按指定的时间间隔发出这些消息。类似于:
Future<void> _wait(int milliseconds) async =>
await Future<void>.delayed(Duration(milliseconds: milliseconds));
Stream<String> generateMessages() async* {
yield 'start';
await _wait(100);
yield 'init_all';
await _wait(400);
yield 'user_pick_x';
yield 'user_start_x';
await _wait(3000);
yield 'interrupt';
}
void main() {
generateMessages().listen((msg) {
print('${DateTime.now()}: $msg');
});
}
这将打印:
2021-07-25 10:21:21.429: start
2021-07-25 10:21:21.531: init_all
2021-07-25 10:21:21.934: user_pick_x
2021-07-25 10:21:21.934: user_start_x
2021-07-25 10:21:24.938: interrupt
如果你想确保流的侦听器异步接收事件 - 因此不干扰等待毫秒,你可以显式使用 StreamController
默认情况下异步调用侦听器(确保import dart:async --- dart:io 仅在 sleep
的示例中使用,以表明即使在阻塞操作中它也会 运行 与等待并行):
import 'dart:async';
import 'dart:io';
Future<void> _wait(int milliseconds) async {
print('WAIT $milliseconds ms');
await Future<void>.delayed(Duration(milliseconds: milliseconds));
}
Stream<String> generateMessages() {
final controller = StreamController<String>(sync: false);
controller.onListen = () async {
controller.add('start');
await _wait(100);
controller.add('init_all');
await _wait(400);
controller.add('user_pick_x');
controller.add('user_start_x');
await _wait(3000);
controller.add('interrupt');
};
return controller.stream;
}
void main() {
generateMessages().listen((msg) {
sleep(const Duration(milliseconds: 120));
print('${DateTime.now()}: $msg');
});
}