[Indy10] Szybkość transferu

0

Cześć,

głowię się z jednym problemem.

Jak za pomocą Indy wyświetlić z jaką prędkością dane są wysyłane i pobierane.
Wygrzebałem na google jedne kodzik niby wydaje się być OK ale nie wyświetla mi prędkości, wyświetli powiedzmy 31KB/s i zaraz "ginie" na 0KB/s [???] drugi problem ale to już mniej istotne niby jest ProgressBar i ma być postęp widoczny na nim odebranych pakietów chyba :-O a nic się nie dzieje pozostaje ciągle w pozycji 0;

A na firewallu widzę, że pobiera z prędkością nawet po 130 wiec [???]

procedure TForm1.IdPOPWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Integer);
Var
  S: String;
  TotalTime: TDateTime;
  H, M, Sec, MS: Word;
  DLTime: Double;
  AverageSpeed: Real;
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 := (AWorkCount / 1024) / DLTime;
  S := FormatFloat('0.00 KB/s', AverageSpeed);
  case AWorkMode of
    wmRead : StatusBar1.Panels[1].Text := 'Download speed ' + S;
    wmWrite: StatusBar1.Panels[1].Text := 'Uploade speed ' + S;
  end;
  ProgressBar2.Position := AWorkCount;
end;

procedure TForm1.IdPOPWorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Integer);
begin
  STime := Now;
  ProgressBar2.Max := AWorkCountMax;
end;

Dzięki za pomoc.

0

Zastanawiam się czy nie umieścić tych procedur w jakiejś pętli (np. Timer) i z interwałem 1 sek. uruchamiać przebieg procedury. Dane będą wówczas odświeżane i wynik pokazywany zgodny z przebiegiem programu.

0

masz tu kodzik, którego używam w swoim programie (napisany przeze mnie):

var
  Start, Finish, LastDownload, RozmiarPliku: Integer;

procedure TUpload.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
var
  Transfer: Currency;
begin
  Finish:= GetTickCount;
  Transfer:= ((AWorkCount - LastDownload) / 1024) / ((Finish - Start) / 1000);
  Form1.StatusBar1.Panels[1].Text:= CurrToStrF(Transfer, ffFixed, 2) + ' kb/s';

  Start:= GetTickCount;
  LastDownload:= AWorkCount;
end;

procedure TUpload.IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCountMax: Integer);
begin
  Start:=0;
  Finish:=0;
  LastDownload:=0;
end;

mam nadzieję, że niczego nie pominąłem przy wyciąganiu tego ze swojego kodu

1 użytkowników online, w tym zalogowanych: 0, gości: 1