![]() |
Re: anti freeze idhttp
Ich gib hier mal so das gröbste des Quelltextes vielleicht hilft das ja
Delphi-Quellcode:
const
cFileSplitSize : Int64 = 40*1024; implementation {$R *.dfm} function GetSizeName(const Size : int64): String; 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; procedure TForm13.IdHTTPWorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Integer); begin FTime := GetTickCount; FBytes := 0; Application.ProcessMessages; end; procedure TForm13.IdHTTPWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Integer); begin if not((GetTickCount - FTime) <= 0) then begin try except end; end; FTime := GetTickCount; FBytes := AWorkCount; Application.ProcessMessages; end; procedure TForm13.Button1Click(Sender: TObject); var BytesKopiert, BytesInsgesamt : int64; lStream: TFileStream; begin Button1.Enabled:=false; Timer1.Enabled:=true; Form13.Caption:='Download läuft'; //Initialiesieren Status.Caption := ''; BytesKopiert := 0; Progress.Position := 0; //In edit 1 steht die downzuladene Datei (z.b. [url]http://www.server.com/datei.dat[/url]) Status.Caption := 'Prüfe Header'; // Durch die zwei nächsten Befehle wird die Größe ermittelt und ihn der Variable BytesInsgesamt abgespeichert IdHTTP.Head('http://******.com/update/Tools.exe'); BytesInsgesamt := IdHTTP.Response.ContentLength; //Wenn die Indy Komponente -1 zurückgibt dann bedeutet es des der die Dateigröße nicht zu verfügung //stellt uns somit kann die Datei ganz normall heruntergeladen werden (ohne Fortschrittsanzeige) if BytesInsgesamt = -1 then begin Status.Caption := 'Normalles herunterladen'; Status.Caption := 'Erstelle Datei'; //In Edit 2 steht welche Datei (z.b. C:\datei.dat) //Datei erstellen lStream:=TFileStream.Create(Edit2.Text+'\Tools.exe', fmCreate or fmShareDenyNone); try //und "normal" herunterladen idHTTP.Get('http://*******.com/update/Tools.exe', lStream); finally if Assigned(lStream) then lStream.Free; //FileStream freigeben wenn gesetzt end; //Alles auf fertig stellen Status.Caption := 'Fertig'; SpeedLabel.caption := 'Fertig'; exit; end; //Also wenn wir hier angelangt sind dann bedeutet es der Server hat uns die Dateigröße zur Verfügung gestellt. Progress.Max := BytesInsgesamt; Status.Caption := 'Erstelle Datei'; //In Edit 2 steht welche Datei (z.b. C:\datei.dat) //Datei erstellen lStream:=TFileStream.Create(Edit2.Text+'\Tools.exe', fmCreate or fmShareDenyNone); lStream.Position := 0; try repeat // Damit sich das Programm nicht aufhängt Application.ProcessMessages; //Nun setzen wir den Start nach die bereits kopierten Bytes IdHTTP.Request.ContentRangeStart := BytesKopiert; //Hier wird gebrüft ob die restlichen Bytes größer sind als cFileSplitSize if (BytesInsgesamt-BytesKopiert) > cFileSplitSize then begin //Hier wird einmal die cFileSplitSize eingestellt IdHTTP.Request.ContentRangeEnd := BytesKopiert+cFileSplitSize-1; end //Den rest der Datei else IdHTTP.Request.ContentRangeEnd := BytesInsgesamt; Application.ProcessMessages; //Den eingesttelten Teil herunterladen und ihn die Datei speichern IdHTTP.Get('http://*******.com/update/Tools.exe', lStream); //Progress und Status aktualliesieren Progress.Position := BytesKopiert; Form13.Caption:=GetSizeName(BytesKopiert)+'/'+GetSizeName(BytesInsgesamt); Status.Caption := GetSizeName(BytesKopiert)+'/'+GetSizeName(BytesInsgesamt); Application.ProcessMessages; //BytesKopiert weiter setzen BytesKopiert := BytesKopiert+cFileSplitSize; until (BytesKopiert >= BytesInsgesamt); //Schleife beenden wenn datei fertig finally if Assigned(lStream) then lStream.Free; //FileStream freigeben wenn gesetzt end; //Alles auf fertig stellen Status.Caption := 'Fertig'; SpeedLabel.caption := 'Fertig'; Progress.Position := 100; end; |
Re: anti freeze idhttp
Nimm mal für cFileSlitSize einen niedrigeren Wert z.B. 10*1024 und sag, ob es was gebracht hat.
|
Re: anti freeze idhttp
Da hat sich jetzt schonmal was geändert! der zeigt jetzt 10kb/500kb in 10 kb schritten vorher war das in 40kb Schritten das Problem ist nur jetzt lädt der alle 20 sekunden nicht 40 kb runter sondern 10 kb. Also reagieren tut der genauso schnell aber der lädt langsamer.
|
Re: anti freeze idhttp
Gut, dann solltest du nun den Kompromiss zwischen Downloadgeschwindigkeit und dauer des Einfrierens finden.
|
Re: anti freeze idhttp
Ja das einfrieren bleibt ja immer gleich nur wie schnell der loadet verändert sich immer! Das muss doch irgendwie ohne einfrieren gehen wenn man mit dem Internetexplorer was loadet läuft der ja auch in real zeit.
|
Re: anti freeze idhttp
Ich hsb geschafft. Hab den Quelltext von
![]() |
Re: anti freeze idhttp
Mich interessiert jetzt noch wie kann man die kb/s anzeigen lassen?
|
Re: anti freeze idhttp
Das kann man doch aus deinem ersten Source erschließen ...
|
Re: anti freeze idhttp
Achso aber ich kann das nicht mehr finden was dafür ist. ich wollte nämlich jetzt die restzeit ausrechner mit gesamtgröße minus
fertige geteilt durch kb/s |
Re: anti freeze idhttp
Wie rechnet man das denn aus dass der die kilobyterate ausgibt?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:16 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