2011-11-29 105 views
2

從這段代碼,我該如何返回上傳速度?Indy上傳速度

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; 

會計時器是必要的嗎?

謝謝。

回答

4

假設您使用的是TIdFTP組件,那麼您必須使用OnWorkOnWorkBeginOnWorkEnd事件來計算傳輸速率。

2

TIdFTP.OnWorkBegin事件會告訴您將要發送多少個字節,並且TIdFTP.OnWork事件會告訴您在傳輸過程中迄今爲止發送了多少個字節。根據單個事件觸發與每個事件之間傳輸字節差異之間的時間差,可以計算速度。

0

對於計時器部分:

您可以使用內置的函數和全局變量:

var 
    start, stop, elapsed: TDateTime; 
    ielapsed: Integer; 

// Start the timer 
start := Now; 
// Stop the timer 
stop := Now; 
elapsed := stop - start; 
// Convert to milliseconds 
ielapsed := round(elapsed * 60 * 60 * 24 * 1000); 

由於Windows API函數GetTickCount已經以毫秒爲單位,它的計算經過時間的簡單方法,但僅適用於Windows 2000 +:

var 
    start, stop, elapsed: DWORD; 

start := GetTickCount; 
stop := GetTickCount; 

if (stop > start) then 
begin 
    elapsed := stop - start; 
end 
else 
begin 
    // Handle overflow 
    elapsed := MAXDWORD - start + stop; 
end; 
1

沒有TTimer類是必要的,只有印組件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;