首先在接口部分需要引用System.Net.HttpClient类

uses System.Net.HttpClient,System.IOUtils; 
初始化必需的变量参数

FClient: THTTPClient; //异步下载类
FGlobalStart: Cardinal; //全局计时
FAsyncResult: IAsyncResult; //set and get 异步调用的状态
FDownloadStream: TStream; //下载流

异步下载类的初始化:其中下方的ReceiveDataEvent方法表示响应下载的当前进度:滚动台、百分比等可视化内容可通过其展示给用户

FClient := THTTPClient.Create; //初始化
FClient.OnReceiveData := ReceiveDataEvent;//下载数据进度接收事件
FClient.SecureProtocols := [THTTPSecureProtocol.TLS1,
THTTPSecureProtocol.TLS11, THTTPSecureProtocol.TLS12];//协议类型 可自定义
procedure ReceiveDataEvent(const Sender: TObject;
AContentLength, AReadCount: Int64; var Abort: Boolean);
var
LTime: Cardinal;
LSpeed: Integer;
begin
LTime := TThread.GetTickCount - FGlobalStart;//片段事件
if LTime = 0 then
Exit;
LSpeed := (AReadCount * 1000) div LTime;
// TThread.Queue 将线程放入主线程main窗体执行 用于显示进度
TThread.Queue(nil,
procedure
begin
ProgressBarDownload.Value := AReadCount;
LabelGlobalSpeed.Caption := Format(‘Global speed: %d KB/s’,
[LSpeed div 1024]);
end);
end;
在窗体上放置了一个启动的button按钮,在buttononclick事件中调用SampleDownload方法。SampleDownload方法为实际的下载启动操作

procedure SampleDownload;
var
URL: string;
LResponse: IHTTPResponse;
LFileName: string;
LSize: Int64;
begin
LFileName := EditFileName.Text; //下载文件存放地址
try
URL := EditUrl.Text; //下载地址

LResponse := FClient.Head(URL); //获取请求头
LSize := LResponse.ContentLength; //判断请求头的大小 是否请求成功
Memo1.Lines.Add(Format('Head response: %d - %s', [LResponse.StatusCode,LResponse.StatusText]));//打印出请求状态 和 状态内容
LResponse := nil; //释放请求头内容
ProgressBarDownload.Maximum := LSize; //进度条的最大值 要注意的是vcl与fmx进度条maxium不同
ProgressBarDownload.Minimum := 0; //进度条起点
ProgressBarDownload.Value := 0; //进度条当前值
LabelGlobalSpeed.Caption := 'Download speed: 0 KB/s';Memo1.Lines.Add(Format('Downloading: "%s" (%d Bytes) into "%s"',[EditFileName.Text, LSize, LFileName]));// Create the file that is going to be dowloaded
FDownloadStream := TFileStream.Create(LFileName, fmCreate); //下载流初始化以及文件权限设置
FDownloadStream.Position := 0; //下载流从起点开始 初始化// Start the download process
FGlobalStart := TThread.GetTickCount;
FAsyncResult := FClient.BeginGet(DoEndDownload, URL, FDownloadStream);//返回异步调用状态 以及 随时可控 可断

finally
BStopDownload.Enabled := FAsyncResult <> nil; //判断异步调用状态
BStartDownload.Enabled := FAsyncResult = nil; //释放
end;
end;

//接收下载的状态 包括自然下载成功或用户人为终止
procedure DoEndDownload(const AsyncResult: IAsyncResult);
var
LAsyncResponse: IHTTPResponse;
begin
try
//判断异步调用的状态
LAsyncResponse := THTTPClient.EndAsyncHTTP(AsyncResult);
//将此线程阻塞到主线程中去 在ui界面上告知用户操作状态
TThread.Synchronize(nil,
procedure
begin
if AsyncResult.IsCancelled then
Memo1.Lines.Add(‘Download Canceled’)
else
begin
Memo1.Lines.Add(‘Download Finished!’);
Memo1.Lines.Add(Format(‘Status: %d - %s’, [LAsyncResponse.StatusCode,
LAsyncResponse.StatusText]));
end;

    BStopDownload.Enabled := False;BStartDownload.Enabled := True;end);

finally
LAsyncResponse := nil;
FreeandNil(FDownloadStream);
end;
end;
放置了一个停止的Button按钮,在buttononclick中调用FAsyncResult.Cancel;方法可终止下载操作。

完整代码如下:

unit DownloadForm;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, System.Net.URLClient,
System.Net.HttpClient, System.Net.HttpClientComponent, Vcl.ComCtrls,
Vcl.StdCtrls, System.Types, Vcl.ExtCtrls;

type
TFormDownload = class(TForm)
Panel1: TPanel;
Label1: TLabel;
Label2: TLabel;
EditFileName: TEdit;
EditUrl: TEdit;
BStartDownload: TButton;
LabelGlobalSpeed: TLabel;
BStopDownload: TButton;
Panel2: TPanel;
Memo1: TMemo;
ProgressBarDownload: TProgressBar;
procedure BStartDownloadClick(Sender: TObject);
procedure ReceiveDataEvent(const Sender: TObject; AContentLength: Int64;
AReadCount: Int64; var Abort: Boolean);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure BStopDownloadClick(Sender: TObject);
private
{ Private declarations }
FClient: THTTPClient;
FGlobalStart: Cardinal;
FAsyncResult: IAsyncResult;
FDownloadStream: TStream;
procedure SampleDownload;
procedure DoEndDownload(const AsyncResult: IAsyncResult);
public
{ Public declarations }
end;

var
FormDownload: TFormDownload;

implementation

uses System.IOUtils;
{$R *.dfm}

procedure TFormDownload.BStopDownloadClick(Sender: TObject);
begin
(Sender as TButton).Enabled := False;
FAsyncResult.Cancel;
end;

procedure TFormDownload.DoEndDownload(const AsyncResult: IAsyncResult);
var
LAsyncResponse: IHTTPResponse;
begin
try
LAsyncResponse := THTTPClient.EndAsyncHTTP(AsyncResult);
TThread.Synchronize(nil,
procedure
begin
if AsyncResult.IsCancelled then
Memo1.Lines.Add(‘Download Canceled’)
else
begin
Memo1.Lines.Add(‘Download Finished!’);
Memo1.Lines.Add(Format(‘Status: %d - %s’, [LAsyncResponse.StatusCode,
LAsyncResponse.StatusText]));
end;

    BStopDownload.Enabled := False;BStartDownload.Enabled := True;end);

finally
LAsyncResponse := nil;
FreeandNil(FDownloadStream);
end;
end;

procedure TFormDownload.ReceiveDataEvent(const Sender: TObject;
AContentLength, AReadCount: Int64; var Abort: Boolean);
var
LTime: Cardinal;
LSpeed: Integer;
begin
LTime := TThread.GetTickCount - FGlobalStart;
if LTime = 0 then
Exit;
LSpeed := (AReadCount * 1000) div LTime;
TThread.Queue(nil,
procedure
begin
ProgressBarDownload.Value := AReadCount;
LabelGlobalSpeed.Caption := Format(‘Global speed: %d KB/s’,
[LSpeed div 1024]);
end);
end;

procedure TFormDownload.FormCreate(Sender: TObject);
begin
FClient := THTTPClient.Create;
FClient.OnReceiveData := ReceiveDataEvent;
FClient.SecureProtocols := [THTTPSecureProtocol.TLS1,
THTTPSecureProtocol.TLS11, THTTPSecureProtocol.TLS12];
end;

procedure TFormDownload.FormDestroy(Sender: TObject);
begin
FDownloadStream.Free;
FClient.Free;
end;

procedure TFormDownload.BStartDownloadClick(Sender: TObject);
begin
BStartDownload.Enabled := False;
SampleDownload;
end;

procedure TFormDownload.SampleDownload;
var
URL: string;
LResponse: IHTTPResponse;
LFileName: string;
LSize: Int64;
begin
LFileName := EditFileName.Text;
try
URL := EditUrl.Text;

LResponse := FClient.Head(URL);
LSize := LResponse.ContentLength;
Memo1.Lines.Add(Format('Head response: %d - %s', [LResponse.StatusCode,LResponse.StatusText]));
LResponse := nil;
ProgressBarDownload.Maximum := LSize;
ProgressBarDownload.Minimum := 0;
ProgressBarDownload.Value := 0;
LabelGlobalSpeed.Caption := 'Download speed: 0 KB/s';Memo1.Lines.Add(Format('Downloading: "%s" (%d Bytes) into "%s"',[EditFileName.Text, LSize, LFileName]));// Create the file that is going to be dowloaded
FDownloadStream := TFileStream.Create(LFileName, fmCreate);
FDownloadStream.Position := 0;// Start the download process
FGlobalStart := TThread.GetTickCount;
FAsyncResult := FClient.BeginGet(DoEndDownload, URL, FDownloadStream);

finally
BStopDownload.Enabled := FAsyncResult <> nil;
BStartDownload.Enabled := FAsyncResult = nil;
end;
end;

end.

使用上述方法,便可使用Delphi完成异步下载Delphi是真的强大超级大爱

原文地址:https://www.cnblogs.com/ne1620/p/16454384.html

Delphi使用THTTPClient实现异步下载相关推荐

  1. [Swift]在不依赖三方库的情况下如何异步下载和缓存图片?

    在可滚动视图(如UITableView)中异步加载大量图片是一个很常见的任务. 然而,在图片正在下载的同时又要保持应用程序流畅滚动,可能有点挑战. 许多开发人员依靠像Alamofire和SDWebIm ...

  2. Android异步下载

    概述 实现App常见下载公共 支持通知栏显示 支持 暂停.取消功能,使用Service.AsyncTask实现异步下载.特点简单.实用.方便源码扩展修改 详细 代码下载:http://www.demo ...

  3. Android多线程分析之一:使用Thread异步下载图像

    打算整理一下对 Android Framework 中多线程相关知识的理解,主要集中在 Framework 层的 Thread, Handler, Looper, MessageQueue, Mess ...

  4. Android异步下载网络图片(其三:ExecutorService)

    在第一节中,我们使用Handler.Thread/Runnable .URL.HttpURLConnection等等来进行异步下载网络图片.然后第二节中换了AsyncTask方式.那么这一节我们再应用 ...

  5. Android异步下载网络图片(其二:AsyncTask)

    在上一节中,我们使用Handler.Thread/Runnable .URL.HttpURLConnection等等来进行异步下载网络图片. 但是采用这种方式有一些缺点,如下: 线程的开销较大,如果每 ...

  6. Android异步下载网络图片(其一:Handler)

    项目中有时候需要获取网络上的图片,并下载下来到手机客户端显示.怎么做呢? 实现思路是: 1:在UI线程中启动一个线程,让这个线程去下载图片. 2:图片完成下载后发送一个消息去通知UI线程 2:UI线程 ...

  7. unity下载文件三(http异步下载)

    异步下载,顾名思义就是不影响你主线程使用客户端的时候,人家在后台搞你的明堂. 直接入主题,既然要下载,首先得请求,请求成功之后进行回调,这就是一个异步过程,异步回调的时间不可控. 1.首先请求下载. ...

  8. scrapy爬虫框架的分类下载和异步下载到数据库

    1.爬虫项目实战之分类下载宝马车图片地址 https://github.com/yangyu57587720/bmw 2.爬虫项目实战之异步下载简书数据到MySQL数据库 https://github ...

  9. IOS开发基础之异步下载网络图片第1部分

    IOS开发基础之异步下载网络图片第1部分 加入ATS // LJAppInfo.h // 37-异步下载网络图片 // Created by 鲁军 on 2021/3/10. #import < ...

  10. Android项目实战(三十一):异步下载apk文件并安装(非静默安装)

    前言: 实现异步下载apk文件 并 安装.(进度条对话框显示下载进度的展现方式) 涉及技术点: 1.ProgressDialog   进度条对话框  用于显示下载进度 2.AsyncTask     ...

最新文章

  1. 梳理十年Kaggle竞赛,看自然语言处理的变迁史
  2. C#排队处理DEMO
  3. svn: error while loading shared libraries: libsvn_client-1.so.0
  4. 一个不错的游戏 - flash webgame
  5. 收藏 : 50个Excel逆天功能,一秒变“表哥”
  6. AC Automaton
  7. 模糊查询关键字不区分大小写_SQL简单查询
  8. 编程师代码G都喜欢的|细致场景森系插画手机壁纸
  9. 计算机基础及linux入门
  10. html页面添加视频背景设置为自动播放,打开网址就会自动播放,简单有效亲测
  11. sqlite:WAL模式
  12. Python---PDF转JPG图片
  13. webuploader 手机端上传图片默认打开相机 改为选择相册
  14. 【代码随想录】【LeetCode】自学笔记07 - 栈和队列
  15. Word中在囗中打勾或打叉的方法介绍
  16. 看点快报视频解析去水印原理及源码,初窥腾讯视频的解析奥妙
  17. MISC总结——隐写术(四)
  18. Codeforces Round #710 (Div. 3)个人题解
  19. beego的定时任务
  20. 如何一步步成为一名架构师?满满干货指导

热门文章

  1. camera 测光模式 和 实际应用
  2. 沪江日语频道 » 日语真题
  3. 新元宇宙奇科幻小说每周连载《地球人奇游天球记》第十二回金星挖矿
  4. TYUT太原理工大学2022需求工程考试简答题
  5. 285. 二叉搜索树中的中序后继
  6. arduino 超声波测距原理_[Arduino]超声波测距
  7. 【寒江雪】SSL通信详解
  8. win32_mfc 理论资料 供自己查阅
  9. 一文带你详解你不知道的ADL原理
  10. 品牌,来1TB反向传播?