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


Автор: Pentium02 19.6.2007, 20:12
Собственно как измерить скорость закачки? Как я понимаю надо измерить скоко байт за секунду скачано, так? (ток чёт не пойму как реализовать) Качаю в цикле всем известным способом. И ещё как это вывести в отдельный поток? чтоб интерфейс проги не тормозил

Код

function TMainForm.DownloadFile(URLd, OutFile: string): Boolean;
var
  F: File;
  ResumePos,BufferLen: DWORD;
  hSession, hURL: HInternet;
  Buffer: array[1..512] of Byte;
  err: boolean;
  sfs: integer;

  function GetInetFileSize(Const AURL: String): Integer;
  var
    HSession, HFile: HInternet;
    Buffer: array [1..20] of Char;
    BufferLen, Index: Cardinal;
  begin
    Result := 0;
    HSession := InternetOpen(NIL, INTERNET_OPEN_TYPE_PRECONFIG, NIL, NIL, 0);
    If Assigned(HSession) Then Begin
      HFile := InternetOpenURL(HSession, PChar(AURL), NIL, 0, INTERNET_FLAG_RELOAD, 0);
    Index := 0;
    BufferLen := 20;
    If HttpQueryInfo(HFile, HTTP_QUERY_CONTENT_LENGTH, @Buffer, BufferLen, Index) Then
      Result := StrToInt(StrPas(@Buffer));
    InternetCloseHandle(HFile);
    InternetCloseHandle(Hsession);
    End;
  End;
begin
  ResumePos:=0;
  AssignFile(F,OutFile);
  if FileExists(OutFile) then
    begin
      Reset(f,1);
      ResumePos:=FileSize(F);
      Seek(F, FileSize(F));
    end else ReWrite(f,1);
  NADO:= TRUE;
  hSession:= InternetOpen('p02downloader',PRE_CONFIG_INTERNET_ACCESS,nil,nil,0);
  hURL := InternetOpenURL(hSession,PChar(URLd),nil,0,0,0);
  sfs:= GetInetFileSize(URLd); //получаю размер файла
  if ResumePos>0 then
    InternetSetFilePointer(hURL,ResumePos,nil,0,0);
  repeat
    err:= InternetReadFile(hURL, @Buffer,SizeOf(Buffer),BufferLen);
    IF err= false then
      begin
        ShowMessage ('Произошел облом :(');
        exit;
      end;
    BlockWrite(f, Buffer, BufferLen);
    Application.Processmessages;
  until (BufferLen= 0) Or (NADO= FALSE); Result:=True; CloseFile(f);
end;

Автор: MetalFan 19.6.2007, 20:56
Цитата(Pentium02 @  19.6.2007,  20:12 Найти цитируемый пост)
 IF err= false then

простите, но LOL!

Цитата(Pentium02 @  19.6.2007,  20:12 Найти цитируемый пост)
until (BufferLen= 0) Or (NADO= FALSE); Result:=True; CloseFile(f);

жэсть! кто ж так писать научил????

Автор: Pentium02 19.6.2007, 21:06
Дык это не я писал))) пример был откудато взят) я просто не стал заморачиваться

Автор: MetalFan 19.6.2007, 21:23
ну ладно. по делу:
запоминаешь время (GetTickCount например) перед началом закачки.
потом "читаешь" файл из инета кусками по N Mb/Kb/b. 
ну и скорость соотв высчитываешь

Автор: Pentium02 20.6.2007, 15:19
А можно плз на примере?

Автор: MetalFan 20.6.2007, 17:26
Цитата(Pentium02 @  20.6.2007,  15:19 Найти цитируемый пост)
А можно плз на примере? 

а самому подумать? smile

примерно как-то так:
Код

function GetInetFileSize(Const AURL: String): Integer;
var
  HSession, HFile: HInternet;
  Buffer: array [1..20] of Char;
  BufferLen, Index: Cardinal;
begin
  Result := 0;
  HSession := InternetOpen(NIL, INTERNET_OPEN_TYPE_PRECONFIG, NIL, NIL, 0);
  If Assigned(HSession) Then
  Begin
    HFile := InternetOpenURL(HSession, PChar(AURL), NIL, 0, INTERNET_FLAG_RELOAD, 0);
    Index := 0;
    BufferLen := 20;
    If HttpQueryInfo(HFile, HTTP_QUERY_CONTENT_LENGTH, @Buffer, BufferLen, Index) Then
      Result := StrToInt(StrPas(@Buffer));
    InternetCloseHandle(HFile);
    InternetCloseHandle(Hsession);
  End;
End;


function DownloadFile(URLd, OutFile: string): Boolean;
var
  F: File;
  ResumePos,BufferLen: DWORD;
  hSession, hURL: HInternet;
  Buffer: array[1..512] of Byte;
  lOk: boolean;
  lSize: integer;
  //
  lDownloadedSize: Cardinal;
  lStartTime: Cardinal;
  lSpeed: Integer;
begin
  ResumePos:=0;
  AssignFile(F,OutFile);
  try
    if FileExists(OutFile) then
    begin
      Reset(f,1);
      ResumePos:=FileSize(F);
      Seek( F, FileSize(F) );
    end
    else
      ReWrite( f, 1 );
    hSession:= InternetOpen('p02downloader',PRE_CONFIG_INTERNET_ACCESS,nil,nil,0);
    hURL := InternetOpenURL(hSession,PChar(URLd),nil,0,0,0);
    try
      //lSize:= GetInetFileSize(URLd); //получаю размер файла
      if ResumePos > 0  then
        InternetSetFilePointer(hURL,ResumePos,nil,0,0);
      lStartTime := GetTickCount;
      lDownloadedSize := 0;
      repeat
        IF not InternetReadFile(hURL, @Buffer,SizeOf(Buffer),BufferLen) then
          begin
            //ShowMessage ('Произошел облом :(');
            exit;
          end;

        BlockWrite(f, Buffer, BufferLen);

        inc( lDownloadedSize, BufferLen );
        lSpeed := lDownloadedSize / ((GetTickCount - lStartTime) * 1000) div 1024; //kB per sec
        //Application.Processmessages;
      until (BufferLen= 0);
      Result:=True;
    finally
      InternetCloseHandle( hSession );
      InternetCloseHandle( hURL );
    end;
  finally
    CloseFile(f);
  end;
end;

дальше сам придумывай

Автор: Pentium02 22.6.2007, 18:00
спасибо)

Автор: MetalFan 22.6.2007, 22:38
Pentium02, да на здоровье) если помогло - с тебя плюсик smile

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