Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 颤振中何处可以定义隔离?如何在flatter中启动线程?_Multithreading_Flutter_Dart Isolates - Fatal编程技术网

Multithreading 颤振中何处可以定义隔离?如何在flatter中启动线程?

Multithreading 颤振中何处可以定义隔离?如何在flatter中启动线程?,multithreading,flutter,dart-isolates,Multithreading,Flutter,Dart Isolates,我是一个新手,所以这个问题可能有点明显,但我在互联网上找不到任何答案 我有一个带有一些屏幕的颤振应用程序,我会说在第五个屏幕上有一个按钮,它会触发一些繁重的计算工作(转换数千张图像)。在同一屏幕上有一个进度条,它应该显示进度 我对如何在技术上实现这一点感到困惑。在按下按钮时,触发明显发生 如果我只是调用一个Future函数,那么UI在处理过程中会完全冻结,这显然不是期望的行为 如果我把我的函数放在里面,在第一次wait时,我会得到异常 未处理的异常:异常:在初始化绑定之前访问了Services

我是一个新手,所以这个问题可能有点明显,但我在互联网上找不到任何答案

我有一个带有一些屏幕的颤振应用程序,我会说在第五个屏幕上有一个按钮,它会触发一些繁重的计算工作(转换数千张图像)。在同一屏幕上有一个进度条,它应该显示进度

我对如何在技术上实现这一点感到困惑。在按下按钮时,触发明显发生

  • 如果我只是调用一个
    Future
    函数,那么UI在处理过程中会完全冻结,这显然不是期望的行为
  • 如果我把我的函数放在里面,在第一次
    wait
    时,我会得到异常
    未处理的异常:异常:在初始化绑定之前访问了ServicesBinding.defaultBinaryMessenger。如果您正在运行应用程序,并且需要在调用runApp()之前访问二进制messenger(例如,在插件初始化期间),那么您需要先显式调用WidgetsFlutterBinding.ensureInitialized()。
    这让我很困惑,因为我调用了
    WidgetsFlutterBinding.ensureInitialized()
    runApp()之前
    。无论如何,这种方法不起作用
compute(计算函数,“参数”);
// ...
静态函数(字符串参数)异步{
等待第一步函数();
// ...
  • 如果我将函数放入,我会得到异常
    未处理的异常:无效参数:Isolate.spawn希望传递一个静态或顶级函数,这也让我感到困惑。我试图使函数
    静态
    ,并将函数移动到第五个屏幕模块的顶层。没有任何更改。我应该在
    函数启动
    Isolate
    吗?在所有漂亮的示例中都是这样是这样做的。我不能在按钮中间点击“<代码>隔离>代码>。
隔离.spawn(计算函数,receivePort.sendPort); // ... void计算函数(发送端口发送端口)异步{ 等待第一步函数(); // ... 在Java中,我认为一个简单的
新线程(…).start()
就可以完成这项工作

但如何在颤振中做到这一点


更新:

在我的实验中我注意到,无论是颤振热重启还是热重新加载都不能正确使用隔离。你真的需要重新运行整个应用程序

我成功地启动了
隔离。如果
异步
/
等待
关键字被删除,则生成
很好。当然,调用的函数应该有它的同步版本。因此,这不是通用的

隔离.spawn(计算函数,receivePort.sendPort); // ... 静态void计算函数(SendPort SendPort){//async已删除 firstStepFunctionSync();//该函数将替换为其同步版本 // ... 我找到了允许运行异步函数的包:

spawn.spawn(计算函数、参数);
// ...
void计算函数(发送端口发送端口)异步{
等待第一步函数();
// ...
我将尝试在我的原型中使用
flatter\u isolation
包。

您应该阅读并查看包:isolations

这篇文章对比了使用主线程、compute、Isolate-proper和isolates包,以及它们各自的优缺点。这是我很久以来看到的最好的文章

还请记住,Java线程是数据共享的,这可能导致死锁。Dart隔离不共享任何内容,使用“端口”在隔离之间小心地移动数据,不需要锁定