
【免费下载链接】LauncherThis fork of Prism Launcher adds integrated support for Ely.by accounts.项目地址https://gitcode.com/GitHub_Trending/ely/Launcher点击查看免费下载在 Ely Prism LauncherPrism Launcher 的 Ely.by 账号整合分支中新建实例下载游戏文件、更新模组、检查资源更新等操作都依赖一套统一的任务进度体系。本文拆解其中的核心类SequentialTask它如何把多个子任务串成一条流水线并把第 X 步 / 共 N 步实时反映为界面上的总进度条帮你快速读懂源码、扩展自己的多阶段任务。一图看懂任务体系Task → ConcurrentTask → SequentialTask整个进度体系建立在三层继承关系上源码位于 launcher/tasks/层级类职责基类Task定义状态机Inactive/Running/Succeeded/Failed、进度信号progress、状态文本status中间层ConcurrentTask维护子任务队列按max_concurrent并发调度特化层SequentialTask将并发数固定为1实现严格顺序执行基类Task通过 Qt 信号把进度广播出去任何界面只需connect几个信号就能画出进度条见 launcher/tasks/Task.hprogress(current, total)总进度数值驱动进度条status / details状态与详情文本stepProgress(TaskStepProgress)每个子任务的独立进度驱动子任务进度列表succeeded / failed / aborted终态通知SequentialTask 如何实现一个一个来SequentialTask的实现极其巧妙——它并没有重写调度逻辑而是直接复用ConcurrentTask把并发上限设为 1launcher/tasks/SequentialTask.cppSequentialTask::SequentialTask(QString task_name) : ConcurrentTask(task_name, 1) {}父类ConcurrentTask内部用三个容器管理子任务m_queue排队、m_doing执行中、m_done已完成。核心调度方法executeNextSubTask在执行中数量达到上限时直接返回上限为 1 时自然形成串行队列前一个子任务完成后会再次触发调度取出下一个launcher/tasks/ConcurrentTask.cpp。总进度条的推进规则按完成的阶段数计算这是总进度条最关键的一点。SequentialTask重写了updateState()launcher/tasks/SequentialTask.cppsetProgress(m_done.count(), totalSize()); setStatus(tr(Executing task %1 out of %2)...);也就是说总进度 已完成子任务数 / 子任务总数。每完成一个阶段进度条前进一格状态文本显示Executing task 2 out of 5。父类的updateState还有单任务特判当只有一个子任务时直接把该子任务的字节级进度透传给父进度条避免假进度launcher/tasks/ConcurrentTask.cpp。快速失败任何一步出错整条链立刻终止SequentialTask覆写了subTaskFailed子任务一失败就立即emitFailed(msg)不再执行后续阶段launcher/tasks/SequentialTask.cpp。这符合后一步依赖前一步结果的语义——比如资源没下载完就不能做下一步的校验。实战案例新建实例时游戏文件的总进度条在创建 Minecraft 实例并下载游戏文件时InstanceCreationTask构造了一个典型的SequentialTasklauncher/InstanceCreationTask.cppaddTask(MinecraftLoadAndCheck)先加载并校验版本清单再依次addTask四个更新阶段来自 MinecraftInstance::createUpdateTaskFoldersTask创建实例目录LibrariesTask下载 Java 库LegacyFMLLibrariesTask处理老版 Forge 库AssetUpdateTask更新游戏资源调用propagateFromOther(task.get())把子任务的 status/progress/stepProgress 全部桥接到外层任务这样上层ProgressDialog无需感知内部结构用户看到的就是顶部总进度条按 5 个阶段推进状态栏提示当前执行到第几步。另一个直接继承SequentialTask的自定义任务见 launcher/minecraft/mod/tasks/GetModDependenciesTask.h它按先查项目信息、再取依赖清单的顺序依次拉取 Modrinth / Flame 平台的模组元数据。进度弹窗如何渲染这套信号界面端由 launcher/ui/dialogs/ProgressDialog.cpp 负责execWithTask统一连接progress、status、stepProgress等信号根据task-isMultiStep()决定是否显示子任务进度滚动区launcher/ui/dialogs/ProgressDialog.cppchangeStepProgress为每个子任务动态创建一个SubTaskProgressBar小进度条子任务完成后自动隐藏launcher/ui/dialogs/ProgressDialog.cpp小进度条组件定义在 launcher/ui/widgets/SubTaskProgressBar.h于是总进度条globalProgressBar与逐条子进度条形成了宏观 微观的双层反馈。与 ConcurrentTask、MultipleOptionsTask 的选型对比任务容器并发度失败行为适用场景ConcurrentTask默认 6 路并发汇总所有失败原因独立文件并行下载SequentialTask1严格串行首个失败即终止有依赖关系的阶段链MultipleOptionsTask1串行继续尝试下一个直到成功多候选源依次兜底见 launcher/tasks/MultipleOptionsTask.h单元测试test_basicSequentialRun验证了三个子任务按序全部成功的路径tests/Task_test.cpp可作为扩展新任务时的回归参照。源码文件速查 基类与进度信号launcher/tasks/Task.h顺序执行特化launcher/tasks/SequentialTask.h并发调度与状态更新launcher/tasks/ConcurrentTask.cpp实例创建串接更新任务launcher/InstanceCreationTask.cpp更新阶段清单launcher/minecraft/MinecraftInstance.cpp进度弹窗渲染launcher/ui/dialogs/ProgressDialog.cpp理解这套体系后你会发现新增一个多阶段任务只需继承SequentialTask按依赖顺序addTask再交给ProgressDialog展示——总进度条、状态文本、子任务明细全部自动完成。赞分享【免费下载链接】LauncherThis fork of Prism Launcher adds integrated support for Ely.by accounts.项目地址https://gitcode.com/GitHub_Trending/ely/Launcher点击查看免费下载相关推荐Ely Prism Launcher 并发下载调度终极指南ConcurrentTask 的进度聚合与任务编排Ely Prism Launcher 并发下载调度终极指南ConcurrentTask 的进度聚合与任务编排 Ely Prism LauncherPrism如何快速看懂 Ely Prism Launcher 的任务框架Task、SequentialTask 与 ConcurrentTask 设计剖析如何快速看懂 Ely Prism Launcher 的任务框架Task、SequentialTask 与 ConcurrentTask 设计剖析 Ely PrTkinter-Designer进度条实现任务进度可视化Tkinter Designer进度条实现任务进度可视化 你是否在使用Tkinter开发GUI应用时遇到过任务执行过程中界面无响应、用户不知道当前进度的问题开发工具代码生成低代码创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考