При работе с настольным приложением flutter (linux) мне нужно выполнить некоторую интенсивную вычислительную задачу в изолированном пространстве. Но пока этот изолятор выполняет эту долгую операцию, он не читает входящие сообщения (что кажется логичным). Я хотел бы по-прежнему иметь возможность общаться с ним во время его выступления.
ReceivePort rPort;
SendPort sPort;
Isolate isolate;
void main() {
rPort = ReceivePort();
isolate = await Isolate.spawn(entryPoint, receivePort.sendPort);
sPort = await rPort.first;
sendMessage("perform"); // this is being processed
sendMessage("controlMessage"); // this is being processed after the perform has ended
}
void sendMessage(String msg) {
ReceivePort localReceivePort = ReceivePort();
sendPort.send([msg, localReceivePort.sendPort]);
}
void entryPoint(SendPort sendPort)
{
ReceivePort receivePort = ReceivePort();
sendPort.send(receivePort.sendPort);
receivePort.listen((message) {
String data = msg[0];
SendPort reply = msg[1];
print(data);
if(data == "perform") performBlockingOperation();
else if(data == "controlMessage") controlPerformance();
repy.send("something");
});
}
Я пробовал много вариантов: сделать performBlockingOperation асинхронным, но, похоже, это не сработало. Даже попытка создать собственный поток внутри изолята возвращает
../../third_party/dart/runtime/vm/runtime_entry.cc: 3331: ошибка: невозможно вызвать собственный обратный вызов за пределами изолированного объекта.
Есть ли способ добиться того, что я пытаюсь?
Isolate
и по-прежнему получать входящие сообщения? или вы хотите получить следующее сообщение в очереди после завершения одного большого цикла вычислительной задачи? - person pskink   schedule 26.04.2020await Future(() {});
, чтобы датьreceivePort.listen()
шанс выполнить свою работу - person pskink   schedule 26.04.2020await Future(() {listenAndDoSomething});
? Потому что с пустым оператором Future он, похоже, здесь не работает (я думал, что пустое await Future, как вы написали, затем приостановит выполнение, чтобы дать слушателю Isolate время для прослушивания). Я продолжу расследование. - person Philiste   schedule 27.04.2020print
внутри цикла производительности не печатается, что странно. Так что у меня может возникнуть другая проблема с реализацией. Глядя на это, я вернусь, как только смогу это исправить. - person Philiste   schedule 27.04.2020print('step $i');
? как придешь? Вы успешно создали изолят? - person pskink   schedule 27.04.2020while(performAudioBlock()) { print("step $i"); }
. - person Philiste   schedule 27.04.2020channel.sink.add('input data')
из основного потока в течение первых 10 шагов цикла изоляции - конечно, вы можете вызыватьchannel.sink.add
несколько раз - person pskink   schedule 27.04.2020while(performAudioBlock()){}
выходит за пределы цикла событий изоляции. В зависимости от размера аудиоблока он вычисляет 512 двойных 40 раз в секунду. Есть ли способ узнать, происходит ли это переполнение? - person Philiste   schedule 28.04.2020SchedulerBinding
, но если текущий подход сработает ... - person pskink   schedule 28.04.2020