求文件下载并显示下载速度的实例。(100分)

  • 主题发起人 主题发起人 XIAOLE
  • 开始时间 开始时间
X

XIAOLE

Unregistered / Unconfirmed
GUEST, unregistred user!
3年没碰delphi了,现在编点东西举步维艰。
要求不高能下载http文件并实时显示下载速度就可以。
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
IdHTTP, StdCtrls, IdAntiFreezeBase, IdAntiFreeze;

type
TForm1 = class(TForm)
IdHTTP1: TIdHTTP;
Button1: TButton;
Label1: TLabel;
IdAntiFreeze1: TIdAntiFreeze;
Label2: TLabel;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
private
FFileSize: Integer;
FTimeInc: Integer;
FWorkCount: Integer;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const
cURL = 'http://down.sandai.net/WebThunder1.12.2.210.exe';
var
s: TMemoryStream;
begin
s := TMemoryStream.Create;
try
with IdHTTP1 do begin
//允许链接跳转
HandleRedirects := True;
ReadTimeout := 100000;
//获得文件大小
Head(cURL);
FFileSize := Response.ContentLength;
FTimeInc := GetTickCount;
FWorkCount := 0;
//下载文件
Get(cURL,s);
s.SaveToFile('WebThunder1.12.2.210.exe');
end;
finally
s.Free;
end;
end;

procedure TForm1.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
var
iNow,iDelay,iSize: Integer;
begin
iNow := GetTickCount;
//获得时间差
iDelay := iNow - FTimeInc;
if iDelay = 0 then Exit;
FTimeInc := iNow;
//获得时间差内下载的数据大小
iSize := AWorkCount - FWorkCount;
FWorkCount := AWorkCount;
Label1.Caption := IntToStr(AWorkCount div 1024) + '/' +
IntToStr(FFileSize div 1024) + ' KByte';
Label2.Caption := FloatToStr(iSize div iDelay) + ' Kb/秒';
end;

end.
 
谢谢liyinwei的代码。
不过这样得出的是单位时间内平均下载速度,我要得出的是当前的实际下载速度。
就跟快车或迅雷一样能实时显示正在传输的速度。
有更好的办法解决这个问题吗?
还有就是开始下载的时候界面会假死,看来得用多线程。
 
楼上的代码是可以的
 
要解决假死,在界面上放一个 TIdAntiFreeze 组件,这个组件就是 Indy 专门做出来处理这个问题的。
 
TIdAntiFreeze 已经在界面上了怎么还是假死?
重新建一个工程也一样,需要设置属性还是别的吗?
 
不需要任何设置。
楼主还是检查一下是否其它地方导致了界面假死吧。
 
Thank you liyinwei!
从新安装delphi和Indy后解决假死问题了。
 
后退
顶部