Delphi10.2.3利用THttpClient实现http异步下载
随着Delphi 10.2.3的发布,随之带来更稳定、更完善的版本。今天借官方的例子,解读一下如何实现Http异步下载并显示下载进度。
procedure TFormDownloadDemo.FormCreate(Sender: TObject);
begin
FClient := THTTPClient.Create;
FClient.OnReceiveData := ReceiveDataEvent;
end;
我们看到,这里为FClient实现了OnReceiveData事件,目的用来显示下载进度,注意这个事件在异步执行Http下载时,是在线程中执行的。来看一下具体的实现代码:
procedure TFormDownloadDemo.ReceiveDataEvent(const Sender: TObject; AContentLength, AReadCount: Int64;
var Abort: Boolean);
var
LTime: Cardinal;
LSpeed: Integer;
begin
LTime := TThread.GetTickCount - FGlobalStart;//计算用时
LSpeed := (AReadCount * ) div LTime;//计算下载速度
TThread.Queue(nil,
procedure
begin
ProgressBarDownload.Value := AReadCount;//显示下载进度
LabelGlobalSpeed.Text := Format('Global speed: %d KB/s', [LSpeed div ]);//显示下载速度
end);
end;
procedure TFormDownloadDemo.SampleDownload;
var
URL: string;
LResponse: IHTTPResponse;
LFileName: string;
LSize: Int64;
begin
LFileName := TPath.Combine(TPath.GetDocumentsPath, EditFileName.Text);//本地保存的文件地址
try
URL := EditURL.Text;//文件的URL地址 LResponse := FClient.Head(URL);//取得IHTTPResponse接口,通过该接口获得下载文件的长度
LSize := LResponse.ContentLength;//求出下载内容的长度
Memo1.Lines.Add(Format('Head response: %d - %s', [LResponse.StatusCode, LResponse.StatusText]));
LResponse := nil; ProgressBarDownload.Max := LSize;//设置进度条的最大值
ProgressBarDownload.Min := ;
ProgressBarDownload.Value := ;
LabelGlobalSpeed.Text := 'Global speed: 0 KB/s'; Memo1.Lines.Add(Format('Downloading: "%s" (%d Bytes) into "%s"' , [EditFileName.Text, LSize, LFileName])); // 建立一个文件流FDownloadStream,准备用于保存下载内容
FDownloadStream := TFileStream.Create(LFileName, fmCreate);//建立下载文件流
FDownloadStream.Position := ; FGlobalStart := TThread.GetTickCount;//取开始下载时间,用于计算下载速度 // 开始下载
FAsyncResult := FClient.BeginGet(DoEndDownload, URL, FDownloadStream); finally
BStopDownload.Enabled := FAsyncResult <> nil;//下载过程中允许中止下载
BStartDownload.Enabled := FAsyncResult = nil;//下载完成后允许开始下载
end;
end;
procedure TFormDownloadDemo.DoEndDownload(const AsyncResult: IAsyncResult);
var
LAsyncResponse: IHTTPResponse;
begin
try
LAsyncResponse := THTTPClient.EndAsyncHTTP(AsyncResult);//通过传进来的参数,取得异步响应接口
TThread.Synchronize(nil,
procedure
begin
Memo1.Lines.Add('Download Finished!');
Memo1.Lines.Add(Format('Status: %d - %s', [LAsyncResponse.StatusCode, LAsyncResponse.StatusText]));
end);
finally
LAsyncResponse := nil;
FreeandNil(FDownloadStream);
BStopDownload.Enabled := False;
BStartDownload.Enabled := True;
end;
end;
Delphi10.2.3利用THttpClient实现http异步下载的更多相关文章
- 一个简单的利用 WebClient 异步下载的示例(一)
继上一篇文章 一个简单的利用 HttpClient 异步下载的示例 ,我们知道不管是 HttpClient,还算 WebClient,都不建议每次调用都 new HttpClient,或 new We ...
- [.NET] 利用 async & await 的异步编程
利用 async & await 的异步编程 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/5922573.html 目录 异步编程的简介 异 ...
- [.NET] 利用 async & await 进行异步 IO 操作
利用 async & await 进行异步 IO 操作 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/6082673.html 序 上次,博主 ...
- 利用 async & await 的异步编程
走进异步编程的世界 - 开始接触 async/await 利用 async & await 的异步编程 async 的三大返回类型 公司技术需求备忘录
- 教你50招提升ASP.NET性能(二十二):利用.NET 4.5异步结构
(40)Take advantage of .NET 4.5 async constructs 招数40: 利用.NET 4.5异步结构 With the arrival of .NET 4.5, w ...
- 利用jquery.form实现异步上传文件
实现原理 目前需要在一个页面实现多个地方调用上传控件上传文件,并且必须是异步上传.思考半天,想到通过创建动态表单包裹上传文件域,利用jquery.form实现异步提交表单,从而达到异步上传的目的,在上 ...
- 一个简单的利用 WebClient 异步下载的示例(三)
继续上一篇 一个简单的利用 WebClient 异步下载的示例(二) 后,继续优化它. 1. 直接贴代码了: DownloadEntry: public class DownloadEntry { p ...
- 一个简单的利用 WebClient 异步下载的示例(二)
继上一篇 一个简单的利用 WebClient 异步下载的示例(一) 后,我想把核心的处理提取出来,成 SkyWebClient,如下: 1. SkyWebClient 该构造函数中 downloadC ...
- 一个简单的利用 HttpClient 异步下载的示例
可能你还会喜欢 一个简单的利用 WebClient 异步下载的示例 ,且代码更加新. 1. 定义自己的 HttpClient 类. using System; using System.Collec ...
随机推荐
- python之scrapy模拟登陆人人网
1.settings.py主要配置信息,包括USER_AGENT等 # -*- coding: utf-8 -*- # Scrapy settings for renren project # # F ...
- linux 执行shell脚本的时候,生成的log文件乱码
脚本执行后,生成的log文件,cat打开没有问题,vim打开就是文字乱码. file1完全没有问题,其他人的file2追加到file中间的时候就出现了这个问题. 因为使用notepad在win7写的, ...
- Mac 配置vscode调试PHP
Mac系统版本:MacOS Mojave 10.14.5 vscode:1.36.0 MacOS Mojave 10.14.5 系统自带 PHP 7.1.23 1.开启php sudo vim / ...
- hive数据类型1
- 【查看修复HDFS中丢失的块】org.apache.hadoop.hdfs.BlockMissingException: Could not obtain block: BP
首先得好看有多少损坏的文件,其中需要使用Hadoop的fsck命令: 以下是官方解释 用法: hadoop fsck //路径 以上将会展示该路径下所有受损的文件 最后用-delete 可以清除掉 ...
- Java集合(2):两个生成器的例子:Collection生成器CollectionData及Map生成器MapData
Collection生成器CollectionData CollectionData体现了适配器模式的设计思想,它能把实现Generator接口的类的对象(包括上一章数组中的各种RandomGener ...
- Tanimoto Coefficient
Tanimoto Coefficient The Tanimoto coefficient between two points, a and b, with k dimensions is calc ...
- Server2008实验——私钥和添加数据恢复代理程序
导出和安装私钥 当一个用户加密一个文件的时候,生成证书,拥有证书的私钥的用户才能够解开这个加密文件:为了防止私钥丢失导致加密文件不可打开,可以导出私钥给同一个用户组的用户帮忙打开: 1.创建[xl]和 ...
- Spark GraphX初探
1. Graphx概念 针对某些领域,如社交网络.语言建模等,graph-parallel系统可以高效地执行复杂的图形算法,比一般的data-parallel系统更快. Graphx是将graph-p ...
- shell脚本常见的结构化函数
if-then if command then command fi if-then-else if command then command else command fi 嵌套if if comm ...