![]() |
anti freeze idhttp
Hallo, ich hab mit idhttp und mit einem Balken der anzeigt wieviel von der Datei geloadet ist. Jetzt hab ich noch eine antifreeze Funktion drin aber das Programm friert immer für 20 sekunden ein und dann funktioniert es einmal ganz kurz. Wie kann ich das ändern?
|
Re: anti freeze idhttp
Versuch mal Application.ProcessMessages im OnWork Ereignis.
Florian |
Re: anti freeze idhttp
Also die Process message ist schon drin
Delphi-Quellcode:
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; |
Re: anti freeze idhttp
Dann wird wohl das OnWork Ereigniss nur alle 20 Sekunden aufgerufen, vielleicht, weil die Komponente so viel von der Datei downloaded, wie der Buffer groß ist, dann das OnWork Ereigniss ausführt, den Buffer leert und dann den zweiten Teil der Datei downloaded.
Florian |
Re: anti freeze idhttp
Gibt es denn da eine kommplett andere möglichkeit damit das nicht einfriert?
|
Re: anti freeze idhttp
Vielleicht über einen Timer immer wieder ProcessMessages aufrufen, aber ob das sinnvoll ist, ist eine andere Frage ...
|
Re: anti freeze idhttp
hmmm, der regiert immer noch nicht schneller, aber gibt es nicht ein Tutorial wo das gleich ist aber nicht immer einfriert?
|
Re: anti freeze idhttp
Wenn es wirklich so ist, dass der Buffer in diesem Falle zu groß ist, könntest du ja mal versuchen die Buffergröße runterzusetzen.
|
Re: anti freeze idhttp
Wo steht die denn ???? Ich hab von dem IdHttp noch nicht so viel erfahrung.
|
Re: anti freeze idhttp
Genau weiß ich es auch nicht, aber gibt es nicht eine property BufferSize oder MaxBufferSize, oder so?
|
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 20:20 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