Flutter Isolate解决耗时任务导致卡死
先来对比一下在Flutter的ui主线程下直接计算一个耗时任务的情况:
import 'package:flutter/material.dart';void main() {runApp(const MaterialApp(home: H(),));
}class H extends StatefulWidget {const H({super.key});@overrideState<H> createState() => _HState();
}class _HState extends State<H> {int _count = 0;@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text("耗时计算"),),body: Center(child: Text("$_count"),),floatingActionButton: FloatingActionButton(child: const Text("start"),onPressed: () {_count = countPrimes(100000000);setState(() {});}),);}
}// 计算质数个数
int countPrimes(int n) {List<bool> isPrime = List.filled(n + 1, true);isPrime[0] = isPrime[1] = false;for (int i = 2; i * i <= n; i++) {if (isPrime[i]) {for (int j = i * i; j <= n; j += i) {isPrime[j] = false;}}}return isPrime.where((prime) => prime).length;
}
发现点击按钮后,直接卡死,现在换成异步执行:
import 'package:flutter/material.dart';void main() {runApp(const MaterialApp(home: H(),));
}class H extends StatefulWidget {const H({super.key});@overrideState<H> createState() => _HState();
}class _HState extends State<H> {int _count = 0;@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text("耗时计算"),),body: Center(child: Text("$_count"),),floatingActionButton: FloatingActionButton(child: const Text("start"),onPressed: () async {_count = await countPrimes(100000000);setState(() {});}),);}
}// 计算质数个数
Future<int> countPrimes(int n) async {List<bool> isPrime = List.filled(n + 1, true);isPrime[0] = isPrime[1] = false;for (int i = 2; i * i <= n; i++) {if (isPrime[i]) {for (int j = i * i; j <= n; j += i) {isPrime[j] = false;}}}return isPrime.where((prime) => prime).length;
}
发现仍旧会卡死,因为计算过程还是发生在ui线程中,现在使用isolate进行对比:
import 'dart:isolate';import 'package:flutter/material.dart';void main() {runApp(const MaterialApp(home: H(),));
}class H extends StatefulWidget {const H({super.key});@overrideState<H> createState() => _HState();
}class _HState extends State<H> {int _count = 0;ReceivePort? _receivePort;@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text("耗时计算"),),body: Center(child: Text("$_count"),),floatingActionButton: FloatingActionButton(child: const Text("start"),onPressed: () {_receivePort = ReceivePort();Isolate.spawn(countPrimes, [100000000, _receivePort!.sendPort]);_receivePort!.listen((message) {setState(() {_count = message;});});}),);}
}// 计算质数个数
void countPrimes(List<dynamic> args) {int n = args[0];SendPort sendPort = args[1];List<bool> isPrime = List.filled(n + 1, true);isPrime[0] = isPrime[1] = false;for (int i = 2; i * i <= n; i++) {if (isPrime[i]) {for (int j = i * i; j <= n; j += i) {isPrime[j] = false;}}}sendPort.send(isPrime.where((prime) => prime).length);
}
发现问题得到解决
相关文章:
Flutter Isolate解决耗时任务导致卡死
先来对比一下在Flutter的ui主线程下直接计算一个耗时任务的情况: import package:flutter/material.dart;void main() {runApp(const MaterialApp(home: H(),)); }class H extends StatefulWidget {const H({super.key});overrideState<H> createState() >…...
使用deepseek快速创作ppt
目录 1.在DeekSeek生成PPT脚本2.打开Kimi3.最终效果 DeepSeek作为目前最强大模型,其推理能力炸裂,但是DeepSeek官方没有提供生成PPT功能,如果让DeepSeek做PPT呢? 有个途径:在DeepSeek让其深度思考做出PPT脚本…...
STM32的HAL库开发---高级定时器---输出比较模式实验
一、高级定时器输出比较模式实验原理 定时器的输出比较模式总共有8种,本文使用其中的翻转模式,当TIMXCCR1TIMXCNT时,翻转OC1REF的电平,OC1REF为输出参考信号,高电平有效,OC1REF信号连接到0C1上面ÿ…...
python Excel 表读取合并单元格以及清除空格符
读取合并单元格并保留合并信息 读取合并单元格并保留合并信息清除各单元格的空格和换行符,并去除列名中的空格和换行符 读取合并单元格并保留合并信息 当我们只是使用 pandas 的 read_excel 方法读取 Excel 文件时,我们可能会遇到一个很棘手的问题&…...
额外题目汇总2-链表
链表 1.24. 两两交换链表中的节点 力扣题目链接(opens new window) 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 思路 使用虚拟头结点会很方便ÿ…...
C#控件开发6—指示灯
按钮功能:手自动旋转,标签文本显示、点击二次弹框确认(源码在最后边); 【制作方法】 找到控件的中心坐标,画背景外环、内圆;再绘制矩形开关,进行角度旋转即可获得; 【关…...
探索从传统检索增强生成(RAG)到缓存增强生成(CAG)的转变
在人工智能快速发展的当下,大型语言模型(LLMs)已成为众多应用的核心技术。检索增强生成(RAG)(RAG 系统从 POC 到生产应用:全面解析与实践指南)和缓存增强生成(CAG&#x…...
【学习总结|DAY036】Vue工程化+ElementPlus
引言 在前端开发领域,Vue 作为一款流行的 JavaScript 框架,结合 ElementPlus 组件库,为开发者提供了强大的构建用户界面的能力。本文将结合学习内容,详细介绍 Vue 工程化开发流程以及 ElementPlus 的使用,助力开发者快…...
【GitHub】GitHub 2FA 双因素认证 ( 使用 Microsoft Authenticator 应用进行二次验证 )
文章目录 一、GitHub 的 2FA 双因素认证二、使用 Microsoft Authenticator 应用进行二次验证1、TOTP 应用2、下载 Microsoft Authenticator 应用3、安装使用 Authenticator 应用 三、恢复码重要性 一、GitHub 的 2FA 双因素认证 现在登录 GitHub 需要进行二次身份验证 ; 先登录…...
c# 2025/2/7 周五
13.《表达式,语句详解1》 18未完。。 表达式,语句详解_1_哔哩哔哩_bilibili...
蓝桥杯思维训练(五)
文章目录 子集II1191.K次串联后最大子数组之和 子集II 子集II 思路分析: 求解子集的问题的关键就是,通过递归与回溯,我们就是得确定以某个元素开始的子集,对于这个题目来说,比较麻烦的一点就是,存在重复的…...
I.MX6ULL 中断介绍下
GIC重点寄存器 1.中断分发器寄存器(Distributor register ) a.Distributor Control Register(中断分发控制寄存器), GICD_CTLR Purpose Enables the forwarding of pending interrupts from the Distributor to the CPU interfaces 使能将挂起的中断从…...
Elasticsearch 生产集群部署终极方案
Elasticsearch 集群部署 1.集群部署1.1 新增用户1.2 优化操作系统1.3 JDK1.4 elasticsearch1.5 开机自启动 2.安全认证功能2.1 生成CA证书2.2 生成密钥2.3 上传至其他节点2.4 修改属主、属组2.5 配置文件添加参数2.6 各节点添加密钥库密码2.7 设置用户密码 1.集群部署 1.1 新增…...
Python用langchain、OpenAI大语言模型LLM情感分析苹果股票新闻数据及提示工程优化应用...
全文链接:https://tecdat.cn/?p39614 本文主要探讨了如何利用大语言模型(LLMs)进行股票分析。通过使用提供的股票市场和金融新闻获取数据,结合Python中的相关库,如Pandas、langchain等,实现对股票新闻的情…...
【正点原子K210连载】第六十七章 音频FFT实验 摘自【正点原子】DNK210使用指南-CanMV版指南
第六十七章 音频FFT实验 本章将介绍CanMV下FFT的应用,通过将时域采集到的音频数据通过FFT为频域。通过本章的学习,读者将学习到CanMV下控制FFT加速器进行FFT的使用。 本章分为如下几个小节: 32.1 maix.FFT模块介绍 32.2 硬件设计 32.3 程序设…...
Centos Ollama + Deepseek-r1+Chatbox运行环境搭建
Centos Ollama Deepseek-r1Chatbox运行环境搭建 内容介绍下载ollama在Ollama运行DeepSeek-r1模型使用chatbox连接ollama api 内容介绍 你好! 这篇文章简单讲述一下如何在linux环境搭建 Ollama Deepseek-r1。并在本地安装的Chatbox中进行远程调用 下载ollama 登…...
ReactNative进阶(五十九):存量 react-native 项目适配 HarmonyOS NEXT
文章目录 一、前言二、ohos_react_native2.1 Fabric2.2 TurboModule2.2.1 ArkTSTurboModule2.2.2 cxxTurboModule: 三、拓展阅读 一、前言 2024年10月22日19:00,华为在深圳举办“原生鸿蒙之夜暨华为全场景新品发布会”,主题为“星河璀璨&…...
go并发和并行
进程和线程 进程(Process)就是程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位,进程是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间。…...
一种解决SoC总线功能验证完备性的技术
1. 前言 通过总线将各个IP通过总线连接起来的SoC芯片是未来的大趋势,也是缩短芯片开发周期,抢先进入市场的常用方法。如何确保各个IP是否正确连接到总线上,而且各IP的地址空间分配是否正确,是一件很棘手的事情。本文提出了一种新…...
Web3 与区块链:开启透明、安全的网络新时代
在这个信息爆炸的时代,我们对网络的透明性、安全性和隐私保护的需求日益增长。Web3,作为新一代互联网的代表,正携手区块链技术,引领我们走向一个更加透明、安全和去中心化的网络世界。本文将深入探讨 Web3 的基本概念、区块链技术…...
正交试验DOE在算法参数优化中的高效应用
1. 正交试验DOE:算法调参的"聪明捷径" 第一次接触算法参数优化时,我像大多数人一样陷入了暴力搜索的陷阱。记得当时调一个简单的随机森林模型,5个参数各试5个值,总共需要3125次训练!直到发现正交试验设计&am…...
别再只会下载安装包了!手把手教你从源码编译最新版kkFileView(附避坑指南)
从源码构建kkFileView:解锁定制化文件预览的完整指南 在当今数字化办公环境中,文件预览功能已成为各类系统的标配需求。虽然官方提供的预编译安装包能够快速部署,但对于追求最新特性、需要深度定制或有私有化部署需求的技术团队而言ÿ…...
OCS2与Pinocchio联调避坑指南:如何让机械臂MPC求解速度提升3倍?
OCS2与Pinocchio联调避坑指南:如何让机械臂MPC求解速度提升3倍? 在工业机械臂控制领域,实时模型预测控制(MPC)的求解效率直接决定了系统的响应速度与稳定性。OCS2作为ETH Zurich开发的高性能MPC求解器,结合…...
DirectX兼容性解决方案:让经典游戏在Windows 10重获新生
DirectX兼容性解决方案:让经典游戏在Windows 10重获新生 【免费下载链接】dxwrapper Fixes compatibility issues with older games running on Windows 10 by wrapping DirectX dlls. Also allows loading custom libraries with the file extension .asi into gam…...
AirNgin ESP32 MQTT客户端:面向工业IoT的平台化固件库
1. 项目概述AirNgin ESP32 MQTT Client 是一款专为 ESP32 平台设计的 Arduino 兼容库,面向伊朗本土 IoT 平台 AirNgin 构建。该库并非通用 MQTT 封装,而是深度集成 AirNgin 云平台特有协议栈与管理逻辑的生产级固件组件。其核心价值在于将设备接入、状态…...
MOS管驱动电路设计要点与常见问题解析
1. 一个简单MOS驱动电路引发的思考前两天在实验室调试电路时,遇到一个很有意思的案例。同事设计了一个使用NMOS管的驱动电路,用于控制LED的开关。乍看之下电路结构很简单,但实际调试时却发现MOS管无法正常导通。这个看似简单的问题背后&#…...
别再只用DoDragDrop了!手把手教你用WPF实现一个能拖拽合并数据的自定义控件(附完整源码)
WPF高级拖拽交互实战:从原生API局限到自定义控件设计 在构建现代桌面应用时,流畅自然的拖拽交互往往能极大提升用户体验。WPF虽然提供了基础的DoDragDrop API,但当我们需要实现复杂场景如卡片合并、动态数据交换时,原生方案就显得…...
深入剖析PHP 7.4.21开发服务器源码泄露漏洞及其复现过程
1. PHP开发服务器源码泄露漏洞初探 最近在测试PHP 7.4.21开发服务器时,我发现一个挺有意思的漏洞——源码可以直接被读取。这可不是闹着玩的,想象一下你的网站源代码像裸奔一样暴露在外,数据库配置、加密逻辑全都一览无余。这个漏洞影响所有P…...
Wave-U-Net:基于波形直接处理的AI音频分离技术实践指南
Wave-U-Net:基于波形直接处理的AI音频分离技术实践指南 【免费下载链接】Wave-U-Net Implementation of the Wave-U-Net for audio source separation 项目地址: https://gitcode.com/gh_mirrors/wa/Wave-U-Net 在音频处理领域,传统频谱转换方法常…...
jquery-match-height完全教程:5分钟学会创建完美等高元素
jquery-match-height完全教程:5分钟学会创建完美等高元素 【免费下载链接】jquery-match-height a responsive equal heights plugin 项目地址: https://gitcode.com/gh_mirrors/jq/jquery-match-height jquery-match-height是一款强大的响应式等高元素插件&…...
