2011-11-29 4 views
2

De ce code, comment puis-je retourner la vitesse de téléchargement?Indy vitesse de téléchargement

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; 

Une minuterie est-elle nécessaire?

Merci.

Répondre

4

En supposant que vous utilisez un composant TIdFTP alors vous devez utiliser les OnWork, OnWorkBegin et OnWorkEnd événements pour calculer le taux de transfert.

2

L'événement TIdFTP.OnWorkBegin vous dira combien d'octets vont être envoyés, et l'événement TIdFTP.OnWork vous dira combien d'octets ont été envoyés jusqu'à présent lors du transfert. En fonction du temps qui s'écoule entre les tirs d'événement individuels et la différence d'octets transférés entre chacun d'entre eux, vous pouvez calculer la vitesse.

0

Pour la partie de la minuterie:

Vous pouvez utiliser les fonctions intégrées et variables globales:

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); 

Depuis la fonction API Windows GetTickCount est déjà en millisecondes, il est un moyen facile de calculer le temps écoulé , mais uniquement sous 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

Aucune classe TTimer est nécessaire, que Indy composant OnWorkBegin, OnWork et événement OnWorkEnd s.

Vous pouvez faire comme ci-dessous mais je vous recommande de mettre du code FTP dans un fil de discussion et de mettre à jour l'interface utilisateur avec la méthode Synchroniser pour de meilleures performances.

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; 
Questions connexes