Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Download sehr langsam (https://www.delphipraxis.net/128164-download-sehr-langsam.html)

freeriders 25. Jan 2009 13:09


Download sehr langsam
 
Hi!
Ich habe mir für mein Programm nen kleinen Autoupdater geschrieben.
Aber der Download ist irgendwie richtig langsam.
Ich habe den Download nach folgendem Beispiel erstellt:
http://www.delphipraxis.net/internal...ct.php?t=56872

Das Programm lädt jetzt pro 3Sekunden ca.40kb.
Die 40kb kommen daher, dass die ProgressBar alle 40kb aktualisiert wird.
Wenn ich nun festlege, dass die ProgressBar alle 512kb aktualisiert wird geht der Download wesentlich shcneller, aber die ProgressBar springt halt.
Ich vermute, das Problem kommt daher, dass ich 2 Dateien lade.
Deswegen habe ich 2 Streams und auch zwei IdHTTP's von Indy.

Nunja hiermal mein Code, vielleicht sieht jemand von euch woran es genau liegt, bzw. kann mir sagen, wie ich den Download von 2 Dateien sonst machen könnte.

Delphi-Quellcode:
const
  cFileSplitSize : Int64 = 40*1024;  //40 KB größe stücke wird die Datei zerhackt
Delphi-Quellcode:
function GetSizeName(const Size : int64): String; //Umschreiben der Größen
begin
  Result := 'Fehler';
  if Size = -1 then exit;
  if Size < 1024 then
  begin
    Result := inttostr(Size)+' Byte';
    exit;
  end;
  if (1024 <= Size) and (Size < 1048576) then
  begin
    Result := floattostr((round((Size/1024)*100))/100)+' KB';
    exit;
  end;
  if (1048576 <= Size) and (Size < 1099511627776) then
  begin
    Result := floattostr((round((Size/1048576)*100))/100)+' MB';
    exit;
  end;
  if Size > 1099511627776 then
  begin
    Result := floattostr((round((Size/1099511627776)*100))/100)+' GB';
  end;
end;
Delphi-Quellcode:
          begin
          Status.Font.Color:=clRed;                 //Anzeigen, dass neues Update gefunden
          Status.Caption:='Update wurde gefunden!'; //--"--
          BytesKopiert:=0;                          //Downloader beginnt
          Progress.Position:=0;
          UpdateHTTP.Head('http://world-fifa-league.de/files/Starter_Update/fifa.db');
          UpdateHTTP2.Head('http://world-fifa-league.de/files/Starter_Update/ger.db');
          BytesInsgesamt:=UpdateHTTP.Response.ContentLength + UpdateHTTP2.Response.ContentLength; //Schreiben der Länge in String
            if BytesInsgesamt=-1 then
            begin
            Status.Font.Color:=clRed;
            Status.Caption:='Normales Herunterladen';
            lStream1:=TFileStream.Create((ExtractFilePath(Application.ExeName)+'WFL_Daten\fifa.db'), fmCreate or fmShareDenyNone);
            lStream2:=TFileStream.Create((ExtractFilePath(Application.ExeName)+'WFL_Daten\ger.db'), fmCreate or fmShareDenyNone);
            try //Herunterladen der Dateien
              Status.Font.Color:=clLime;
              Status.Caption:='Download';
              UpdateHTTP.Get('http://world-fifa-league.de/files/Starter_Update/fifa.db',lStream1);
              UpdateHTTP2.Get('http://world-fifa-league.de/files/Starter_Update/ger.db',lStream2);
            finally //Streams wieder freigeben
              if Assigned(lStream1) then lStream1.Free;
              if Assigned(lStream2) then lStream2.Free;
            end;
            Status.Font.Color:=clLime;
            Status.Caption:='Download beendet';
            exit;
            FrmUpdater.Close;
          end;
          Progress.Max:=BytesInsgesamt; //Download mit Progressbar
          lStream1:=TFileStream.Create((ExtractFilePath(Application.ExeName)+'WFL_Daten\fifa.db'), fmCreate or fmShareDenyNone);
          lStream2:=TFileStream.Create((ExtractFilePath(Application.ExeName)+'WFL_Daten\ger.db'), fmCreate or fmShareDenyNone);
          lStream1.Position:=0;
          lStream2.Position:=0;
          try
            repeat //Verhindern, dass sich das Programm aufhängt
              Application.ProcessMessages;
                Status.Font.Color:=clLime;
                Status.Caption:='Download';
                UpdateHTTP.Get('http://world-fifa-league.de/files/Starter_Update/fifa.db',lStream1);
                UpdateHTTP2.Get('http://world-fifa-league.de/files/Starter_Update/ger.db',lStream2);
                Progress.Position := BytesKopiert;
                Status.Caption := GetSizeName(BytesKopiert)+'/'+GetSizeName(BytesInsgesamt);
                BytesKopiert := BytesKopiert+cFileSplitSize;
                until (BytesKopiert >= BytesInsgesamt); //Schleife beenden wenn datei fertig
          finally
            if Assigned(lStream1) then lStream1.Free; //FileStream freigeben wenn gesetzt
            if Assigned(lStream2) then lStream2.Free;
          end;
          Status.Font.Color:=clLime;
          Status.Caption:='Fertig';
          Progress.Position:=100;
          FrmUpdater.Close;
          end
        else
        Status.Font.Color:=clLime;
        Status.Caption:='Kein Update gefunden!';
        FrmUpdater.Close;
        end;
   end;
end;
So das war es erstmal.
Vielen Dank schonmal für Antworten :)


LG

sx2008 25. Jan 2009 13:22

Re: Download sehr langsam
 
Warum ladest du die Dateien nicht nacheinander herunter?
Stell dir vor, du müsstest 20 Dateien herunterladen - wie dann wohl dein Code aussehen würde (Schauder).
Vorteil: du kannst Unterfunktionen verwenden und der Sourcecode wird viel klarer.
Ablauf:
Alle URLs, die du herunterladen willst sind in einer StringList.
1. Schritt:
in einer Schleife mit .Head() alle Dateigrössen abfragen und aufaddieren.
(Gesamtgrösse wird wg des Progressbars benötigt)
Sollte eine URL nicht vorhanden sein, Fehlermeldung und Benutzer kann entscheiden, ob er Abbrechen oder Ignorieren möchte.
2. Schritt:
in einer Schleife jede URL einzeln herunterladen.

haentschman 25. Jan 2009 13:25

Re: Download sehr langsam
 
Hallo...

nach Deiner Beschreibung würde ich auf den Visualisierungsteil tippen...

Schau dir mal das an...
Delphi-Quellcode:
procedure TDMFTP.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Integer);
begin
  if not MUpdate then
    begin
      Splash.JvXPProgressBar1.Position:= AWorkCount;
      Splash.JvXPProgressBar1.Refresh;
    end;
  FUpdate.JvXPProgressBar1.Position:= AWorkCount;
  FUpdate.JvXPProgressBar1.Refresh;
end;

procedure TDMFTP.IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCountMax: Integer);
begin
  if not MUpdate then Splash.JvXPProgressBar1.Max:= AWorkCountMax;
  FUpdate.JvXPProgressBar1.Max:= AWorkCountMax;
end;
- liefert dir am Start des Download´s die Gesamtgröße und während des Download´s die Menge welche schon da ist :wink:
- da kannst du dir die Berechnung der Progressbar sparen

:hi:

freeriders 25. Jan 2009 14:38

Re: Download sehr langsam
 
Zitat:

Zitat von haentschman
Hallo...

nach Deiner Beschreibung würde ich auf den Visualisierungsteil tippen...

Ja sieht ganz so aus.
Ich habe die Downloads mal hintereinander gehscaltet und das ging.
Was mich allerdings wundert, ist, dass ich mit dem selben Code schonmal nen Download hatte und dort hatte ich nicht diese Probleme.
Naja ich werde mal versuchen die Visualisierung rauszulassen.

Könnte es auch daran liegen, dass es im OnCreate Event ist?
Also kann sowas zu Problemen führen?
Weil es ist ja ein Autoupdater, deswegen muss es in OnCreate.

Danke schonmal an alle, die Antworten gepostet haben.
Werde morgen oder eventuell heute Abend nochmal schreiben, wie es jetzt aussieht ;)


LG

freeriders 26. Jan 2009 19:15

Re: Download sehr langsam
 
Sry schonmal für den Doppelpost.
Aber sonst siehts ja keiner. Hoffe das ist ok :/

@haentschman
Was hast du denn als MUpdate und als FUpdate deklariert?
Ist das bei dir normales Update, oder Update mit Progressbar?
Also MUpdate ist das Update, dass ohne ProgressBar daher kommt, falls die Größe nicht abgefragt werden kann und FUpdate ist das Update mit ProgressBar, wenn die Größe abgefragt werden konnte?


LG

haentschman 26. Jan 2009 19:24

Re: Download sehr langsam
 
MUpdate ist einfach eine Boolsche Variable ob das Update über das Menü gestartet wurde.
MUpdate brauche ich nur um zu unterscheiden, ob das Update beim Programmstart automatisch gestartet wurde und der Fortschrittsbalken im Splash Screen läuft oder in FUpdate.
FUpdate ist die modale Form beim manuellen Update wo nur der Fortschrittsbalken läuft.

...also eigentlich keine Dinge welche für die Funktion relevant sind.
:hi:

freeriders 29. Jan 2009 12:12

Re: Download sehr langsam
 
So melde mich dann noch einmal um zusagen, dass es wunderbar geklappt hat :)
Lag tatsächlich an der Visalisierung.
Also vielen Dank haentschman.

Kann geclosed werden ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:07 Uhr.

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