delphi 协程应用之【协程批量并行下载组件】TdjDownloader,与迅雷一样

news/2025/2/25 16:37:48/文章来源:https://www.cnblogs.com/feng88/p/18736664

下载的问题

我们在开发中,经常要下载一些东西,比如软件的升级包、或模块 bpl、或在线升级等;然后 delphi 官方没有提供下载组件,若开发者自己开发 下载组件,估计很多开发者目前都是使用 主线程 + httpclient 来进行单线程下载,效率低下;原因如下:

  1. I/O(输入/输出)操作的阻塞性:

    • 单线程下载:在单线程中,当进行I/O操作时(如网络数据的读取),CPU会等待该操作完成才能继续执行后续任务。这会导致CPU在等待I/O完成时处于空闲状态,利用率低下。
  2. 网络带宽的利用率:

    • 单线程下载:单线程下载时,网络带宽的利用率往往无法达到最佳状态,因为单个线程无法充分利用网络带宽的波动和冗余。
  3. TCP流量控制的影响:

    • 单线程下载:传统的TCP流量探测机制存在缺陷,一旦检测到丢包,会立即将发送速率降为一半。这会导致下载速率波动较大,难以持续保持高速。
  4. 硬件和资源的限制:

    • 单线程下载:单线程下载受到CPU、内存等硬件资源的限制较小,但无法充分利用网络带宽。

结论

在网速固定的情况下,单线程下载效率很低,线程数也不是越多越好,多线程下载组件,也是难以开发的,还有线程中途取消的问题,我估计 很多厉害的人,也难以开发 像 迅雷这种 下载组件,多线程 分片下载,内存流 顺序合并,还有UI 轮播展示内部信息的问题;

协程下载组件 djDownloader

用协程实现这个 下载组件,只需要 200行代码,实现 迅雷的 分片下载,内存流 顺序合并,并行下载,把您的网速打满,与迅雷的下载 旗鼓相当,多个URL 批量并行下载,显示速率、剩余时间、轮询播放每个URL的进度;

示例代码

procedure TFormMain.Button1Click(Sender: TObject);
beginbutton1.Enabled := False;//搜狗浏览器 82.23MBdjDownloader1.addUrl('https://dlie.sogoucdn.com/se/sogou_explorer_11.0.1.34700_0000.exe', 'C:\测试下载');//QQ音乐 69.86MB 这种带参数的也是没有问题的djDownloader1.addUrl('https://dldir1v6.qq.com/music/clntupate/QQMusic_Setup_2111.exe?aa=xxx&bb=xxx', 'C:\测试下载');//迅雷 7.90MB,不满一个分片djDownloader1.addUrl('https://down.sandai.net/thunder11/XunLeiWebSetup12.1.2.2662xl11.exe', 'C:\测试下载');//360压缩 14.98MB,可以指定不同的文件夹djDownloader1.addUrl('https://sfdl.360safe.com/360zip_setup.exe', 'C:\新文件夹');djDownloader1.start; //批量并行下载
end;

批量下载4个文件,并保存到不同的文件夹下,批量并行下载,支持下载过程中取消;

示例效果

image

其它配置

image

image

完整代码

unit main;interfaceusesWinapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, ddj.Downloader;typeTFormMain = class(TForm)Button1: TButton;djDownloader1: TdjDownloader;procedure Button1Click(Sender: TObject);procedure djDownloader1Canceled(Sender: TObject);procedure djDownloader1Completed(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varFormMain: TFormMain;implementation{$R *.dfm}procedure TFormMain.Button1Click(Sender: TObject);
beginbutton1.Enabled := False;//搜狗浏览器 82.23MBdjDownloader1.addUrl('https://dlie.sogoucdn.com/se/sogou_explorer_11.0.1.34700_0000.exe', 'C:\测试下载');//QQ音乐 69.86MB 这种带参数的也是没有问题的djDownloader1.addUrl('https://dldir1v6.qq.com/music/clntupate/QQMusic_Setup_2111.exe?aa=xxx&bb=xxx', 'C:\测试下载');//迅雷 7.90MB,不满一个分片djDownloader1.addUrl('https://down.sandai.net/thunder11/XunLeiWebSetup12.1.2.2662xl11.exe', 'C:\测试下载');//360压缩 14.98MB,可以为每个URL指定不同的文件夹djDownloader1.addUrl('https://sfdl.360safe.com/360zip_setup.exe', 'C:\测试下载');djDownloader1.start; //批量并行下载
end;procedure TFormMain.djDownloader1Canceled(Sender: TObject);
beginShowMessage('已取消成功!');button1.Enabled := True;
end;procedure TFormMain.djDownloader1Completed(Sender: TObject);
beginShowMessage('已全部下载成功!');button1.Enabled := True;
end;end.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/889638.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对C++书店管理系统的逆向分析

书店管理系统逆向分析报告 一、程序概述该程序为基于命令行的书店管理系统,主要功能包括买家管理、书籍管理和订单管理。支持三种买家类型(会员/普通/贵宾)的差异化折扣策略,并通过文件系统实现数据持久化存储。程序通过类继承实现多态,整体采用模块化设计思想。点击查看代…

05 过拟合(over-fitting)与正则化(regularization)

1. 什么是Overfitting 我们希望神经网络模型能够找到数据集中的一般规律,从而帮助我们预测未知数据。这个过程是通过不断地迭代优化损失函数(也就是预测值和实际值的误差)而实现的。然而随着误差进一步缩小,模型的“走势”过于“贴合”我们的训练数据,对训练数据中的噪声也…

牛客题解 | 删除链表中重复的结点

题目 题目链接 题目的主要信息:在一个非降序的链表中,存在重复的节点,删除该链表中重复的节点 重复的节点一个元素也不保留举一反三: 学习完本题的思路你可以解决如下题目: JZ18. 删除链表的节点 方法一:直接比较删除(推荐使用) 思路: 这是一个升序链表,重复的节点都…

S2-暗影-牧师Priest-团体-大秘境-专精-天赋-配装-宏

S2毕业装--属性 精通>急速>爆击>全能 精通和急速越高越好。爆击随缘。不要全能。 --团本/单体天赋(更新时间2月1日)--团本/单体天赋代码 CIQAAAAAAAAAAAAAAAAAAAAAAAMmZAAAAAAAAAAAAAGmFPAzMz2sNmZmZMzMLDmNmZmZMbMwYMMLmtpmZwCMAmZzywsZAIjxCA --大秘/AOE天赋(更新时…

S2-戒律-牧师Priest-团体-大秘境-专精-天赋-配装-宏

S2毕业装--属性 急速>全能>精通>爆击 急速和全能越高越好。精通和爆击随缘。 --团本天赋(更新时间2月1日)--团本天赋代码 CAQAJSbRac/22NxZbHdYKOQzcAAWmtZGD2GjZmxMbmtZmZmhBAAAAAAAAAAAzilZbYbmZwswwMzMGsw2MNmYBYmBAFgZbW2AjNb --大秘天赋(更新时间2月1日)--大秘天…

牛客题解 | 二叉树的最大深度

牛客题库题解题目 题目链接 题目的主要信息:给定一棵二叉树的根节点,求这棵树的最大深度 深度是指树的根节点到任一叶子节点路径上节点的数量 最大深度是所有叶子节点的深度的最大值 叶子节点是指没有子节点的节点举一反三: 学习完本题的思路你可以解决如下题目: BM29. 二叉…

牛客题解 | 二叉树的深度

牛客题库题解题目 题目链接 题目的主要信息:给定一棵二叉树的根节点,求这棵树的最大深度 深度是指树的根节点到任一叶子节点路径上节点的数量 最大深度是所有叶子节点的深度的最大值 叶子节点是指没有子节点的节点举一反三: 学习完本题的思路你可以解决如下题目: JZ82. 二叉…

牛客题解 | 二叉树中和为某一值的路径(三)

牛客题库题解题目 题目链接 题目的主要信息:给定一个二叉树root和一个整数值 sum ,求该树有多少路径的的节点值之和等于 sum 路径定义不需要从根节点开始,也不需要在叶子节点结束,但是一定是从父亲节点往下到孩子节点,如下图所示:举一反三: 学习完本题的思路你可以解决如…

S2-兽王-猎人Hunt-团体-大秘境-专精-天赋-配装-宏

S2毕业装--属性 急速>爆击>精通>全能 急速和爆击越高越好。精通随缘。不要全能。 --团本/单体天赋(更新时间2月10日)--团本/单体天赋代码 C0PAAAAAAAAAAAAAAAAAAAAAAAMmxGDsALDDNsBAAAAAgBAAAAAAYGLDzyMjhxYmZMMjZGjZmZyMMmZmZmxMjZYMmZGGDGzgN --大秘/AOE天赋(更新时…

牛客题解 | 二叉树中和为某一值的路径(二)

牛客题库题解题目 题目链接 题目的主要信息:题目给出我们一棵树的树根结点指针,和一个期待值 我们要找出这棵树中,从根节点到叶子节点的路径上的节点值之和等于该期待值的路径,找出所有这样的路径并返回。举一反三: 学习完本题的思路你可以解决如下题目: JZ82. 二叉树中和…

S2-恩护-唤魔师Evoker-团体-大秘境-专精-天赋-配装-宏

S2毕业装--属性 爆击>急速>精通>全能 爆击,急速和精通的收益非常接近。全能随缘。 --团本天赋(更新时间2月4日)--团本天赋代码 CwbBV7//nP39x/JJympTqouKSAAAAAAYmZMLzghZGzixMbjZGAAwMjZMDGzIMDAAAwMzIsNzMz2MzAAjZDWALgZYCZgNDD --大秘天赋(更新时间2月4日)--大秘天…

牛客题解 | 二叉搜索树的后序遍历序列

牛客题库题解题目 题目链接 题目的主要信息:题目给出我们一个一维数组sequence 该数组需要我们判定数组sequence中的元素是否符合一个二叉搜索树的后序遍历顺序 如果该数组sequence可以是一种二叉搜索树的后序遍历顺序,则返回true 如果该数组sequence非二叉搜索树的后序遍历顺…