从这段代码中,我如何返回上传速度?
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;需要计时器吗?
谢谢。
发布于 2011-11-29 22:20:38
假设您使用的是TIdFTP组件,则必须使用OnWork、OnWorkBegin和OnWorkEnd事件来计算传输速率。
发布于 2011-11-30 01:05:22
TIdFTP.OnWorkBegin事件将告诉您将要发送的字节数,TIdFTP.OnWork事件将告诉您在传输过程中到目前为止已发送了多少字节。根据各个OnWork事件触发之间经过的时间以及每次触发之间传输的字节数的差异,您可以计算速度。
发布于 2015-09-24 21:33:33
不需要TTimer类,只需要Indy组件OnWorkBegin、OnWork和OnWorkEnd事件。
您可以像下面这样做,但我建议您将FTP代码放在线程中,并使用Synchronize方法更新用户界面以获得最佳性能。
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;https://stackoverflow.com/questions/8311875
复制相似问题