首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Indy上传速度

Indy上传速度
EN

Stack Overflow用户
提问于 2011-11-29 21:52:07
回答 4查看 1.6K关注 0票数 2

从这段代码中,我如何返回上传速度?

代码语言:javascript
复制
procedure TForm1.Button1Click(Sender: TObject);
begin

ftp.Host := 'domain';
ftp.Username := 'username';
ftp.password := 'password';
ftp.Connect;
ftp.Put('random-filename.ext'); //This is where it should grab only the latest file
//label1.caption := 'Download Speed: %s';  
ftp.Quit;
ftp.Disconnect;

end;

需要计时器吗?

谢谢。

EN

回答 4

Stack Overflow用户

发布于 2011-11-29 22:20:38

假设您使用的是TIdFTP组件,则必须使用OnWorkOnWorkBeginOnWorkEnd事件来计算传输速率。

票数 4
EN

Stack Overflow用户

发布于 2011-11-30 01:05:22

TIdFTP.OnWorkBegin事件将告诉您将要发送的字节数,TIdFTP.OnWork事件将告诉您在传输过程中到目前为止已发送了多少字节。根据各个OnWork事件触发之间经过的时间以及每次触发之间传输的字节数的差异,您可以计算速度。

票数 2
EN

Stack Overflow用户

发布于 2015-09-24 21:33:33

不需要TTimer类,只需要Indy组件OnWorkBegin、OnWork和OnWorkEnd事件。

您可以像下面这样做,但我建议您将FTP代码放在线程中,并使用Synchronize方法更新用户界面以获得最佳性能。

代码语言:javascript
复制
interface 

uses
  // ...
  Windows;

type
  TForm1 = class(TForm)
  private
    startWriteTime : DWord;
    byteToWrite : Int64;

    procedure ftp_OnWorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64);
    procedure ftp_OnWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
    procedure ftp_OnWorkEnd(ASender: TObject; AWorkMode: TWorkMode);

    procedure displayWriteSpeed(byteWritten: Int64);
end;

implementation

uses
  // ...
  SysUtils;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ftp.OnWorkBegin := ftp_OnWorkBegin;
  ftp.OnWork := ftp_OnWork;
  ftp.OnWorkEnd := ftp_OnWorkEnd;
  // ...
  ftp.Connect;
  // ...
end;

procedure TForm1.ftp_OnWorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64);
begin
  if AWorkMode = wmWrite then
  begin
    byteToWrite := AWorkCountMax;
    startWriteTime := Windows.GetTickCount;
    displayWriteSpeed(-1);
  end;
end;

procedure TForm1.ftp_OnWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
begin
  if AWorkMode = wmWrite then
  begin
    displayWriteSpeed(AWorkCount);
  end;
end;

procedure TForm1.ftp_OnWorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
  if AWorkMode = wmWrite then
  begin
    displayWriteSpeed(byteToWrite);
  end;
end;

procedure TForm1.displayWriteSpeed(byteWritten: Int64);
var
  elapsedMilliSeconds,  elapsedSeconds : Dword;
  speedBytesPerSeconds : Int64;
begin
  if byteWritten < 0 then
  begin
    {writeSpeedLabel.}Caption := 'upload speed: ?';
    Exit;
  end;

  elapsedMilliSeconds := Windows.GetTickCount - startWriteTime;
  elapsedSeconds := elapsedMilliSeconds div 1000;
  speedBytesPerSeconds := byteWritten div elapsedSeconds;
  {writeSpeedLabel.}Caption := SysUtils.Format('upload speed: %d b/s', [speedBytesPerSeconds ] );
end;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8311875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档