
【免费下载链接】LauncherThis fork of Prism Launcher adds integrated support for Ely.by accounts.项目地址https://gitcode.com/GitHub_Trending/ely/Launcher点击查看免费下载Ely Prism Launcher 是一款支持 Ely.by 账号登录的 Minecraft 启动器Prism Launcher 的 fork它把下载游戏文件、安装 Mod、检查 Java 环境等复杂操作都交给一套统一的异步任务框架来驱动。本文带你逐层剖析launcher/tasks/目录下的三个核心类Task、ConcurrentTask与SequentialTask帮你理解启动器界面里那些进度条和取消按钮背后是如何工作的。一、为什么启动器需要一套任务框架想象一下你点击创建实例按钮后发生的事先下载版本清单JSON 文件再下载游戏本体 jar 包同时并行下载几十个库文件和资源包中途用户可能点击取消界面要实时显示正在执行第 3/10 步如果用一堆嵌套回调或死循环轮询来实现代码会非常难维护。Ely Prism Launcher 的解法是把一切耗时操作都抽象成任务Task任务有统一的状态、进度、日志和取消机制还能像积木一样组合。 整套框架只有 6 个文件位于 launcher/tasks/ 目录文件职责Task.h / Task.cpp任务基类定义状态机与信号ConcurrentTask.h并发任务容器最多同时跑 N 个子任务SequentialTask.h顺序任务并发数固定为 1MultipleOptionsTask.h备选任务逐个尝试直到成功二、Task任务框架的最小积木Task是所有任务的基类见 Task.h它同时继承 Qt 的QObject和QRunnable——前者提供信号槽机制后者让它可以在独立线程中运行。任务的五种状态Task用一个枚举描述了任务的一生enum class State { Inactive, Running, Succeeded, Failed, AbortedByUser };Inactive刚创建尚未开始Running正在执行Succeeded / Failed以成功或失败结束AbortedByUser被用户取消外部调用start()启动任务随后进入子类的executeTask()纯虚函数。任务结束时必须手动调用emitSucceeded()或emitFailed()报告结果见 Task.h这两个方法内部还做了不能重复结束的防错检查。进度与日志界面更新的唯一通道Task提供了三组上报接口UI 只需要监听信号即可接口对应信号界面效果setStatus()status显示正在下载 xxxsetProgress(current, total)progress驱动进度条setDetails()details显示详细备注此外还有abort()/setAbortable()一组取消机制Task.h任务自己声明是否允许取消界面上的取消按钮文本甚至可以由任务动态设置。给新手的记忆点一个合格的子任务类 实现executeTask() 在结束前调用emitSucceeded()/emitFailed() 过程中随时setStatus()/setProgress()。三、ConcurrentTask带并发上限的任务队列如果说Task是单个工人那ConcurrentTaskConcurrentTask.h就是工头——它把多个子任务放进队列按max_concurrent默认 6 个的上限并行执行。内部就是四个桶 一个队列QQueueTask::Ptr m_queue; // 排队等待 QHashTask*, Task::Ptr m_doing; // 正在执行 QHashTask*, Task::Ptr m_done; // 已完成 QHashTask*, Task::Ptr m_failed; // 失败核心调度逻辑在executeNextSubTask()ConcurrentTask.cpp正在执行的任务数没达到上限 → 从队列取一个启动队列空且没有任务在跑 → 结算全部成功则emitSucceeded()有失败的则汇总所有失败原因后emitFailed()每个子任务完成时会触发subTaskFinished()更新统计桶并再调一次调度形成完成一个、补上一个的流水线。失败聚合与进度透传多个子任务失败时会把每份失败原因拼成一段文本一起报出方便排查ConcurrentTask.cpp。子任务的 status / details / progress 信号会被ConcurrentTask转成统一的stepProgress信号向上传递因此界面上能画出每个步骤一行的多步骤进度列表这正是TaskStepProgressList数据结构Task.h的用途。优雅取消ConcurrentTask::abort()ConcurrentTask.cpp的做法很直观清空待执行队列 逐个向正在跑的子任务喊abort()如果有任何一个子任务拒绝取消整体按失败处理并提示Failed to abort all running tasks.。四、SequentialTask并发数锁定为 1 的特例SequentialTask的类声明只有短短几行SequentialTask.hclass SequentialTask : public ConcurrentTask { explicit SequentialTask(QString task_name ); void subTaskFailed(Task::Ptr, const QString msg) override; void updateState() override; };它在构造函数里直接调用ConcurrentTask(task_name, 1)——把并发上限设为 1于是队列天然变成严格串行前一个子任务成功结束后才启动下一个。它与父类的行为差异只有两处SequentialTask.cpp一个失败立即整体失败覆写subTaskFailed()在记录后立刻emitFailed(msg)不再等待剩余任务。因为顺序任务里后续步骤依赖前面的产出继续跑没有意义。状态文案更友好显示Executing task 3 out of 10执行第 3/10 步而不是并发版的同时执行 N 个。源码注释里有一句话很传神A concurrent task that only allows one concurrent task :)—— 它本质上就是只允许 1 个并发的并发任务。如何选择一张表看懂四类任务任务类并发度失败策略典型语义Task1自己跑自己决定单一原子操作ConcurrentTaskmax_concurrent默认 6聚合所有失败原因批量下载等可并行的活儿SequentialTask1失败立即终止有依赖关系的步骤流水线MultipleOptionsTask1全失败才失败逐个尝试的备选方案见 MultipleOptionsTask.cpp五、实战这套框架在启动器里如何落地场景 1创建实例时串行下载游戏文件InstanceCreationTask.cpp 中创建实例的最后一步组装了一个SequentialTask先MinecraftLoadAndCheck在线校验版本清单再依次追加各组件更新任务然后start()。注意它调用了propagateFromOther(task.get())——这是Task提供的一个便利方法Task.cpp能把子组合任务的进度、状态原样透传给自己的监听者调用方因此完全不用关心组合细节。场景 2网络下载是默认并发度的主力用户NetJob.h 让NetJob : public ConcurrentTask把每个网络请求包装成子任务批量执行并发上限来自用户设置项NumberOfConcurrentTasks默认 10见 Application.cpp。Java 检测JavaInstallList.cpp和版本列表加载VersionList.cpp等场景也各自复用了ConcurrentTask/SequentialTask。场景 3启动游戏的 LaunchTask游戏启动流程由 LaunchTask.h 实现它本身是一个Task但内部把检查 Java → 解析服务器地址 → 启动进程拆成一串LaunchStep顺序执行并在失败时覆写emitFailed()做特殊处理——展示了框架允许在子类里定制信号行为的灵活性。六、这套设计的可取之处信号即契约UI 与任务之间只靠 Qt 信号通信界面线程永远不会被阻塞这也解释了为什么进度条即使在下载几百 MB 时也丝滑流畅。继承即编排SequentialTask/MultipleOptionsTask几乎零代码仅靠覆写一两个虚函数就改变了组合语义是以继承表达策略的好例子。防错优先重复start()、非运行态下结束任务等异常路径都有断言与日志保护Task.cpp单元测试 tests/Task_test.cpp 里甚至专门构造了上万个子任务压测栈深度。可取消是一等公民从canAbort()到取消按钮文案可定制取消体验贯穿整个框架。小结Ely Prism Launcher 的任务框架用最小的Task状态机 ConcurrentTask队列调度派生出顺序执行与备选重试两种编排方式。理解这三个类你就掌握了启动器几乎所有异步行为下载、安装、启动、导出的骨架也学到了一个可迁移到任何 GUI 项目的异步任务设计范式。赞分享【免费下载链接】LauncherThis fork of Prism Launcher adds integrated support for Ely.by accounts.项目地址https://gitcode.com/GitHub_Trending/ely/Launcher点击查看免费下载相关推荐Ely Prism Launcher设置持久层设计INIFile与SettingsObject实现完整剖析Ely Prism Launcher设置持久层设计INIFile与SettingsObject实现完整剖析 你是否好奇 Ely Prism LauncherEly Prism Launcher如何做到任何服务器都显示皮肤官方Authlib补丁原理解析Ely Prism Launcher如何做到任何服务器都显示皮肤官方Authlib补丁原理解析 一、Ely Prism Launcher 是什么皮肤为何看如何快速玩转 Ely Prism Launcher 实例级配置覆盖OverrideSetting 与 PassthroughSetting 完整指南如何快速玩转 Ely Prism Launcher 实例级配置覆盖OverrideSetting 与 PassthroughSetting 完整指南 Ely创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考