Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi URLDownloadToFile Speed anzeigen (https://www.delphipraxis.net/100570-urldownloadtofile-speed-anzeigen.html)

ebber 30. Sep 2007 18:04


URLDownloadToFile Speed anzeigen
 
Hallo

ich lade etwas mit URLDownloadtoFile mit diesem http://www.delphipraxis.net/internal....php?p=198#198 herunter. Da gibt es aber nichts was den Speed anzeigt ?

Muss man sich den berechnen aus der Dateigröße und dem schon geladenen ?

MfG

Rastaman 30. Sep 2007 18:46

Re: URLDownloadToFile Speed anzeigen
 
http://www.delphipraxis.net/internal...t.php?t=119484

ebber 1. Okt 2007 23:35

Re: URLDownloadToFile Speed anzeigen
 
Das hat aber nichts mehr mit URLDownloadtoFile zu tun ?

Ich würde eigentlich schon gerne diese Funktion benutzen oder eine etwas mehr Umfangreichere. Diese zeigt nicht so was an, wie schon gedownloaded oder Gesamtgröße ?

MfG

Rastaman 2. Okt 2007 09:15

Re: URLDownloadToFile Speed anzeigen
 
Schon runtergeladen ist ja nun mal das kleinste Problem :)
Einfach eine neue Variable, die am Anfang 0 ist und auf die immer BytesRead addiert wird.
Schon hast du die gedownloadeten Bytes.
Die Abfrage der Größe ist eigentlich auch einfach einzubauen, allerdings habe ich beim Testen immer 0
zurück bekommen. Ich benutze allerdings C++. Versuchs einfach mal mit MSDN-Library durchsuchenInternetReadFileEx oder MSDN-Library durchsuchenHttpQueryInfo

marabu 2. Okt 2007 11:35

Re: URLDownloadToFile Speed anzeigen
 
Hallo,

Zitat:

Zitat von ebber
ich lade etwas mit URLDownloadtoFile herunter. Da gibt es aber nichts was den Speed anzeigt? Muss man sich den berechnen aus der Dateigröße und dem schon geladenen?

wenn du beim Ereignis OnProgress() immer die Zeit nimmst (GetTickCount) und den Wert bei ulProgress = 0 zwischenspeicherst, dann kannst du die Ladegeschwindigkeit (kByte/sec) doch leicht berechnen:

Delphi-Quellcode:
var
  kbsec: Double;
begin
  kbsec := ulProgress * 1000 / 1024 / (GetTickCount - StartTickCount);
end;
Grüße vom marabu

Relicted 2. Okt 2007 11:42

Re: URLDownloadToFile Speed anzeigen
 
huhu!

die unit urlmon ist böse :-)
wenn möglich würde ich das ganze umgehen. ich habe mit einer funktion daraus ne html seite heruntergeladen. unter winXP kein problem. unter win vista (in meinem fall 64bit business) führt der spass in der funktion zu einem bluescreen...
also wenns vista kompatibel sein soll dann bitte urlmon nicht verwenden...

gruß
reli

ebber 3. Okt 2007 12:29

Re: URLDownloadToFile Speed anzeigen
 
Hallo

@ marabu so gehts

@ Rastaman also ich habe es geschafft die schon heruntergeladenen Bytes herauszufinden aber die Größe der Datei konnte ich noch nicht finden und es gibt kein CloseInternetHandle(); und ich habe nichts gefunden was dahin muss. Wie kann man den download abbrechen ?

Das mit Vista ist mir eigentlich "noch" egal. Wenns so weit ist habe ich wieder was zu tun :) . Gibt es bei den beiden Funktionen einen Unterschied in der Effizienz ? Sonst nehme ich eben das Vista kompatiblere.

MfG

Edit: CloseInternetHandle(); = InternetCloseHandle(); :wall:

ebber 4. Okt 2007 14:33

Re: URLDownloadToFile Speed anzeigen
 
Zitat:

Zitat von ebber
Hallo

Gibt es bei den beiden Funktionen einen Unterschied in der Effizienz ?

Diese Frage ist immer noch offen, aber ich habe mich bei der andern ein bisschen schlauer gemacht und es sogar fast selbst gelöst.
Hätte ich vielleicht vor der Frage schon tun sollen...

Hier habe ich nun die ganze funktion noch einmal ein bisschen erweitert, sie findet jetzt die Dateigröße heraus. Und ich habe sie noch ein bisschen für mich angepasst.

Das Problem ist, die bereits heruntergeladenen bytes werden irgendwie nicht richtig gezählt, da kommen zu viel raus, ein bisschen weniger als doppelt so viel. Habe ich da einen Denkfehler drin ?

Delphi-Quellcode:

function TForm1.DownloadFile(const URL: String; const FilePath: String; FileName: String = ''): Boolean;
var
   KbpsCounter, Kbps: Integer;

   Ticks, BytesRead, acsize, index, codelen: DWORD;
   Buffer: Array [0..1023] of Byte;

   hSession, hRequest: HINTERNET;

   DlFile : File;

   code : array[1..20] of char;
   
begin
   Result := False;
   KbpsCounter := 0;

   (* Dateinamen festlegen *)
   if Filename <> '' then
      Filename := FilePath + FileName
   else
      Filename := FilePath + ExtractFileName(Slashtobackslash(URL));

   (* Session öffnen *)
   Label3.Caption := 'connecting ...';
   hSession :=  InternetOpen('AppTitel', INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);
   if hSession <> nil then
   begin
      (* URL öffnen *)
      hRequest :=  InternetOpenUrl(hSession, PChar(URL), nil, 0, INTERNET_FLAG_RELOAD, 0);
      if hRequest <> nil then
      begin

         (* checken ob Datei schon existiert *)
         if FileExists(FileName) then
         if idOK <> (Application.MessageBox('File already exists. Replace ?    '
                                  , PChar(Caption)
                                      , MB_OKCANCEL)) then exit;

         (* Dateigröße herausfinden *)
         Index:= 0;
         CodeLen:= 10;
         HttpQueryInfo(hRequest, HTTP_QUERY_CONTENT_LENGTH, @code, codeLen, Index);
         Label4.Caption := formatfloat('0.00',Strtoint(Pchar(@code)) / 1024 / 1024)+' mb';

         (* Download starten *)
         Label3.Caption := 'starting ...';
         AssignFile(DlFile, FileName);
         try
            Rewrite(DlFile, 1);
            Ticks := GetTickCount;

            while True do
            begin
               (* Daten auslesen *)
               Label3.Caption := 'loading ...';
               if InternetReadFile(hRequest, @Buffer, 1024, BytesRead) = False then
                  Break;

               (* bereits geladene kbps berechnen *)
               acsize := acsize +  BytesRead;
               Label1.caption := formatfloat('0.00', acsize / 1024 / 1024) + ' mb';

               (* kbps jede Sekunde berechnen *)
               Inc(KbpsCounter, BytesRead);
               if Ticks <= (GetTickCount - 1000) then
               begin
                  Kbps := KbpsCounter div 1024;
                  if Kbps < 1000 then
                     Label2.Caption := intToStr(Kbps) + ' kb/s'
                  else
                        Label2.Caption := formatfloat('0.00', Kbps / 1024) + ' mb/s';
                  KbpsCounter := 0;
                  Ticks := GetTickCount;
               end;

               (* In Datei schreiben *)
               if BytesRead <> 0 then
                  BlockWrite(DlFile, Buffer, BytesRead)
               else //Download beendet
               begin
                  Label3.Caption := 'finished';
                  Result := True;
                  Break;
               end;

               if usercancel then
               begin
                  Label3.Caption := 'canceled';
                  Label2.Caption := '';
                  Result := False;
                  Break;
               end;

               Application.ProcessMessages;
            end;
         finally
            CloseFile(DlFile);
            InternetCloseHandle(hRequest);
         end;
      end;
      InternetCloseHandle(hSession);
   end;
end;

Rastaman 4. Okt 2007 17:52

Re: URLDownloadToFile Speed anzeigen
 
acsize 0 setzen bevor du die Bytes in der Schleife drauf addierst?

ebber 4. Okt 2007 18:08

Re: URLDownloadToFile Speed anzeigen
 
Den Fehler habe ich schon bemerkt, hat aber an der Sache nix geändert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:17 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz