![]() |
Download process bei Indy Component ?
Hallo
mit dem Code kann ich eine Datei schnell downloaden:
Delphi-Quellcode:
Ich muss in Ereignis :
procedure TForm1.Button1Click(Sender: TObject);
var Stream:TMemoryStream; http:TidHttp; name,url:string; begin url:='http://xxx.com/test.exe'; //download url name:='c:\test.exe'; // try try Stream := TMemoryStream.Create; http:=TIdHTTP.Create(self); HTTP.Request.Referer := 'http://www.xxx.com'; HTTP.Get(Url,Stream); if FileExists(Name) then DeleteFile(Name); Stream.SaveToFile(Name); except on e:exception do begin //... end; end; finally Stream.Free; http.Free; end; end; OnWork OnWorkbegin OnWorkEnd was eingeben, damit ich die Prozess in Statusbar anschauen Hier habe ich so ähnlich aber der Code ist ganz ganz langsam (mehr als 10 Mals langsamer als normal): ![]() |
Re: Download process bei Indy Component ?
das der Code langsamer ist, ist nicht verwunderlich. Denn im Normalfall lädt man einfach die Daten und fertig. Wenn du jedoch den Status aktuallisierst werden erst noch Messages verarbeitet (eventuell noch Threads syncronisiert) etc. Bau einfach mal eine Zeitmessung in den Work events ein (mit QuertyPerformanceCounter) und du wirst sehen das die visuelle Ausgabe einiges an Zeit verschlingt.
|
Re: Download process bei Indy Component ?
Ja verstehe ich aber das Problem ist nicht 2 Mal langsamer sondern 10 Mals bzw mehr als 1000% Zeit mehr braucht :mrgreen:
|
Re: Download process bei Indy Component ?
Windows ist nun mal nicht für schnelle Grafikoperationen ausgelegt.
|
Re: Download process bei Indy Component ?
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
das stimmt überhaupt nicht. Schaue mal der Power FireFox :wink: Ich verwende FireFox unter Windows XP :mrgreen: |
Re: Download process bei Indy Component ?
Hallo,
ich kenne mich damit nicht so gut aus. Aber: wie oft wird denn das OnWork aufgerufen ? Im verlinkten Thread wird bei jedem Aktualsieren Application.ProcessMessages aufgerufen. Warum ? Wenn ich z.B. einen ProgressBar nehme, dann muss nur beim Ändern der Anzeige (altes % <> neues %) aktualisiert werden.
Delphi-Quellcode:
if iNewPercent>iCurPercent then
begin // aktualisieren // neuen Wert merken iCurPercent:= iNewPercent; ProcessMessages end; Heiko |
Re: Download process bei Indy Component ?
Und evtl. Application.ProcessMessages nur alle 5% aufrufen oder bei jedem 10ten Aufruf von OnWork() ...
![]() |
Re: Download process bei Indy Component ?
Zitat:
|
Re: Download process bei Indy Component ?
Zitat:
|
Re: Download process bei Indy Component ?
Hallo,
< Das könnte das Download beschleunigen. Aber wie kann das einbauen ? > mit mod, wie es oben steht
Delphi-Quellcode:
if (iCurPercent mod 5) =0 then
begin ProgressBar. App.ProcMess. end; Heiko |
Re: Download process bei Indy Component ?
Zitat:
anyway ich habe folgendes gemacht aber ich sah keine Beschleunigung :
Delphi-Quellcode:
if (BytesKopiert mod 5) =0 then
begin Progressbar1.Position := BytesKopiert; Application.ProcessMessages; end; |
Re: Download process bei Indy Component ?
5 Bytes entsprechen ja auch nur bei genau 100 Bytes Downloadgröße den angesprochenen 5 Prozent.
|
Re: Download process bei Indy Component ?
andere Frage - läuft das ganze schneller wenn du das OnWork lässt aber darin alles auskommentierst?
|
Re: Download process bei Indy Component ?
Zitat:
![]() Die Events: OnBegin Onwrk OnEnd von IdHTTP1 sind sowieso leer |
Re: Download process bei Indy Component ?
Wenn ich den Link anklicke sehe ich ein Beispiel mit Verwendung von TIdHttp und Code in den Events onWorkBegin, onWork etc.
Also hast du entweder den Code verwendet und somit doch was drin stehen oder anderen Code. |
Re: Download process bei Indy Component ?
Liste der Anhänge anzeigen (Anzahl: 1)
Hier ist das Demo als Delphi Project (Source ohne exe)
Das Demo funktioniert wunderbar aber wie gesagt zu zu langsam Wer was vorgeschlagen hat, kann selber die Idee in das Projekt einbauen und vorher testen |
Re: Download process bei Indy Component ?
Delphi-Quellcode:
Ca. 2 Sekunden für die 999 kB. Es liegt also nicht am Download.
procedure TForm1.Button2Click(Sender: TObject);
var fs: TFileStream; begin fs := TFileStream.Create('c:\test.zip', fmCreate ); try IdHTTP1.Get('http://melander.dk/download/DragDrop0401rc3.zip', fs); finally fs.Free; end; end; procedure TForm1.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); begin Progressbar1.Position := AWorkCount; end; procedure TForm1.IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer); begin TickStart := GetTickCount; ProgressBar1.Max := AWorkCountMax; end; procedure TForm1.IdHTTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode); begin ShowMessage(IntToStr(GetTickCount - TickStart)+ ' ms'); end; |
Re: Download process bei Indy Component ?
Dein Vorschlag Michael ist zwar Simple aber sehr schnell :thumb:
Wenn es bei dem Code Oben nicht gut klappt werde ich deinen Vorschlag mit Sicherheit verwenden Danke |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:44 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