Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Download process bei Indy Component ? (https://www.delphipraxis.net/130191-download-process-bei-indy-component.html)

thomas2009 4. Mär 2009 22:15


Download process bei Indy Component ?
 
Hallo

mit dem Code kann ich eine Datei schnell downloaden:
Delphi-Quellcode:
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;
Ich muss in Ereignis :
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):
http://www.delphipraxis.net/internal...ct.php?t=81071

SirThornberry 5. Mär 2009 06:06

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.

thomas2009 5. Mär 2009 10:22

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:

Luckie 5. Mär 2009 10:24

Re: Download process bei Indy Component ?
 
Windows ist nun mal nicht für schnelle Grafikoperationen ausgelegt.

thomas2009 5. Mär 2009 11:20

Re: Download process bei Indy Component ?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Luckie
Windows ist nun mal nicht für schnelle Grafikoperationen ausgelegt.

Seit wann ist das ?!
das stimmt überhaupt nicht. Schaue mal der Power FireFox :wink:
Ich verwende FireFox unter Windows XP :mrgreen:

hoika 5. Mär 2009 11:39

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

mirage228 5. Mär 2009 11:59

Re: Download process bei Indy Component ?
 
Und evtl. Application.ProcessMessages nur alle 5% aufrufen oder bei jedem 10ten Aufruf von OnWork() ... Delphi-Referenz durchsuchenmod

thomas2009 5. Mär 2009 13:07

Re: Download process bei Indy Component ?
 
Zitat:

Zitat von mirage228
Und evtl. Application.ProcessMessages nur alle 5% aufrufen oder bei jedem 10ten Aufruf von OnWork() ... Delphi-Referenz durchsuchenmod

Das könnte das Download beschleunigen. Aber wie kann das einbauen ?

Luckie 5. Mär 2009 13:11

Re: Download process bei Indy Component ?
 
Zitat:

Zitat von thomas2009
Zitat:

Zitat von Luckie
Windows ist nun mal nicht für schnelle Grafikoperationen ausgelegt.

Seit wann ist das ?!
das stimmt überhaupt nicht. Schaue mal der Power FireFox :wink:
Ich verwende FireFox unter Windows XP :mrgreen:

Was hat jetzt die Downloadrate mit schnellen Garfikoperationen zu tun?

hoika 5. Mär 2009 13:20

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

thomas2009 5. Mär 2009 13:44

Re: Download process bei Indy Component ?
 
Zitat:

Zitat von hoika
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

was ist das ! Das gehört dem Code nicht
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;

DeddyH 5. Mär 2009 13:48

Re: Download process bei Indy Component ?
 
5 Bytes entsprechen ja auch nur bei genau 100 Bytes Downloadgröße den angesprochenen 5 Prozent.

SirThornberry 5. Mär 2009 13:54

Re: Download process bei Indy Component ?
 
andere Frage - läuft das ganze schneller wenn du das OnWork lässt aber darin alles auskommentierst?

thomas2009 5. Mär 2009 14:18

Re: Download process bei Indy Component ?
 
Zitat:

Zitat von SirThornberry
andere Frage - läuft das ganze schneller wenn du das OnWork lässt aber darin alles auskommentierst?

Das geht um diesen Code : http://www.delphipraxis.net/internal...ct.php?t=81071

Die Events:
OnBegin
Onwrk
OnEnd
von IdHTTP1 sind sowieso leer

SirThornberry 5. Mär 2009 14:41

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.

thomas2009 5. Mär 2009 15:21

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

Luckie 5. Mär 2009 15:41

Re: Download process bei Indy Component ?
 
Delphi-Quellcode:
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;
Ca. 2 Sekunden für die 999 kB. Es liegt also nicht am Download.

thomas2009 5. Mär 2009 16:44

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