使用Indy9的TIdFtp如何计算下载速度? ( 积分: 50 )

  • 主题发起人 主题发起人 linda0606
  • 开始时间 开始时间
L

linda0606

Unregistered / Unconfirmed
GUEST, unregistred user!
使用TIdFtp从FTP下载下载文件,如何得出下载速度?
望有经验者赐教!!!
 
使用TIdFtp从FTP下载下载文件,如何得出下载速度?
望有经验者赐教!!!
 
很简单,它自己就带有demos,其实就用到OnWorkBegin,OnWorkEnd,OnWork三个事件。
以下代码摘自该demos.
procedure TMainForm.IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
Var
S: String;
TotalTime: TDateTime;
// RemainingTime: TDateTime;
H, M, Sec, MS: Word;
DLTime: Double;
begin
TotalTime := Now - STime;
DecodeTime(TotalTime, H, M, Sec, MS);
Sec := Sec + M * 60 + H * 3600;
DLTime := Sec + MS / 1000;
if DLTime > 0 then
AverageSpeed := {(AverageSpeed + }(AWorkCount / 1024) / DLTime{) / 2};

if AverageSpeed > 0 then begin
Sec := Trunc(((ProgressBar1.Max - AWorkCount) / 1024) / AverageSpeed);

S := Format('%2d:%2d:%2d', [Sec div 3600, (Sec div 60) mod 60, Sec mod 60]);

S := 'Time remaining ' + S;
end
else S := '';

S := FormatFloat('0.00 KB/s', AverageSpeed) + '; ' + S;
case AWorkMode of
wmRead: StatusBar1.Panels[1].Text := 'Download speed ' + S;
wmWrite: StatusBar1.Panels[1].Text := 'Uploade speed ' + S;
end;

if AbortTransfer then IdFTP1.Abort;

ProgressBar1.Position := AWorkCount;
AbortTransfer := false;
end;

procedure TMainForm.IdFTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCountMax: Integer);
begin
TransferrignData := true;
AbortButton.Visible := true;
AbortTransfer := false;
STime := Now;
if AWorkCountMax > 0 then ProgressBar1.Max := AWorkCountMax
else ProgressBar1.Max := BytesToTransfer;
AverageSpeed := 0;
end;

procedure TMainForm.IdFTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
begin
AbortButton.Visible := false;
StatusBar1.Panels[1].Text := 'Transfer complete.';
BytesToTransfer := 0;
TransferrignData := false;
ProgressBar1.Position := 0;
AverageSpeed := 0;
end;
 
学习
学习.
 
感谢 chnplzh 兄的帮助,不好意思我没有仔细看DEMO.

我想从FTP下载一些文件,但感觉一个一个下载似乎慢了点
想同时下载5个文件,我在网上查了一下,一直没有找到合适的解决方法.

chnplzh兄以及诸位高手有没有这方面的代码?贴出来.望再施援手!!!!

是多线程还是用多个TidFTP进行连接?
 
其实就是多个TidFTP连接,因为不管你怎么处理,在ftp服务器端体现的肯定是多个socket连接。

至于同时下载文件,当然得使用多线程。
 
谁做过TidFTP和 IdThreadComponent配合起来实现多线程下载,
我以前没有做过多线程,所以这是第一次.
希望高人能指点一下!

chnplzh 兄希望能再施援手!
 
以下是网上的一个例子:

indy多线程创建ftp

作者:佚名 文章来源:本站原创 点击数:432 更新时间:2005-3-23 文章录入:螃蟹 责任编辑:螃蟹

--------------------------------------------------------------------------------

下面是一个简单的例子,我只做了一个线程,如果要更多的线程,在窗体上添加IdThreadComponent并将OnRun关联到IdThreadComponent1Run即可。
对于在OnRun中的语句,我中是简单的写一下,请根据你的实际要求改……
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdComponent, IdTCPConnection, IdTCPClient, IdFTP,
IdBaseComponent, IdThreadComponent;

type
TForm1 = class(TForm)
IdThreadComponent1: TIdThreadComponent;
procedure IdThreadComponent1Run(Sender: TIdCustomThreadComponent);
private
public
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.IdThreadComponent1Run(Sender: TIdCustomThreadComponent);
var
f: TIdFTP;
begin
f := TIdFTP.Create(Self);
try
f.Username := 'anonymous';
f.Password := 'cyd@dl99.net';
f.Host := '192.168.0.1';
f.Port := 21;
while not (Sender.Stopped or Sender.Terminated) do
try
f.Connect;
Sleep(10000);
f.Quit;
except
end;
finally
f.Free;
end;
end;

end.
---------------------------------
网上的这处例子太简单.
我把文件列表放在listview中.
想做到下载的时候,每个线程显示出完成百分比,下载速度.
 
后退
顶部