Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > узнать окончание загрузки файла


Автор: dembel 23.5.2008, 00:45
Здраствуйте. хочу узнать скорость интернета, скачиваю файл, как узнать момент полной загрузки файла? (что бы можно было время засечь)
файл скачиваю при помощи IdHTTP1.Get 

Автор: elestrago 23.5.2008, 07:31
эм берешь и смотриш сколько он скачивает в секунду допустим он скачивает 10 килобайт в секунду, файл весит 200 кб, ну и соответственно кб\сек делишь на длинну файла ну вот примерно таким способом получишь то что он скачает файл за 20 секунд!

на примере кода показать затрудняюсь имхо не когда не использовал IdHTTP1.Get не было нужды 

Автор: dembel14 23.5.2008, 08:52
elestrago, 
а как программно узнать сколько скачивает в секунду?

Автор: elestrago 23.5.2008, 11:14
ну если взять var str.Tfilestream; то по собитию таймера можно сделать проверку позиции в str ( str.position ) и сравнивать с позицией которая была секунду назад ) для этого можно взять перемунную и после проверки позиции в таймере записать эту позицию в переменную:

вот код только за работоспособность не отвечаю ) так как не проверял

Код

var
str:TFilestream;
i,z:integer;
....
begin
i:=0;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
z:=str.position-i;
i:=str.position;
end;



ну вот что то в этом проде )

но не обязательно делать по собитию таймера можно и цикл просто запустить

Автор: Snowy 23.5.2008, 16:38
Цитата(dembel @  23.5.2008,  00:45 Найти цитируемый пост)
как узнать момент полной загрузки файла?
Когда Get закончила работать, тогда файл и скачался.

Автор: sai_NT 14.6.2008, 11:49
Вот кусок примерчика из демки фтп-клиента (замени idFtp1 на idHTTP1 и объяви переменные):
Код

procedure TMainForm.IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
Var
  S: String;
  TotalTime: TDateTime;
//  RemainingTime: TDateTime;
  H, M, Sec, MS: Word;
  DLTime: Double;
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 := {(AverageSpeed + }(AWorkCount / 1024) / DLTime{) / 2};

  if AverageSpeed > 0 then begin
    Sec := Trunc(((ProgressBar1.Max - AWorkCount) / 1024) / AverageSpeed);

    S := Format('%2d:%2d:%2d', [Sec div 3600, (Sec div 60) mod 60, Sec mod 60]);

    S := 'Time remaining ' + S;
  end
  else S := '';

  S := FormatFloat('0.00 KB/s', AverageSpeed) + '; ' + S;
  case AWorkMode of
    wmRead: StatusBar1.Panels[1].Text := 'Download speed ' + S;
    wmWrite: StatusBar1.Panels[1].Text := 'Uploade speed ' + S;
  end;

  ProgressBar1.Position := AWorkCount;
  AbortTransfer := false;
end;

procedure TMainForm.IdFTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCountMax: Integer);
begin
  TransferrignData := true;
  STime := Now;
  if AWorkCountMax > 0 then ProgressBar1.Max := AWorkCountMax
  else ProgressBar1.Max := BytesToTransfer;
  AverageSpeed := 0;
end;

procedure TMainForm.IdFTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
begin
  StatusBar1.Panels[1].Text := 'Transfer complete.';
  BytesToTransfer := 0;
  TransferrignData := false;
  ProgressBar1.Position := 0;
  AverageSpeed := 0;
end;


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)