Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi urlDownloadToFile hängt sich bei IP-Wechsel auf (https://www.delphipraxis.net/127458-urldownloadtofile-haengt-sich-bei-ip-wechsel-auf.html)

Mendelsohn 13. Jan 2009 18:13


urlDownloadToFile hängt sich bei IP-Wechsel auf
 
Hallo,

da ich hier nicht mehr weiterkomme, wende ich mich einmal an das Forum:
Ich möchte mit urlDownloadToFile Dateien herunterladen, allerdings hängt sich die Routine auf, sobald die Verbindung abbricht (z.B. weil gerade routinemäßig die dynamische IP vom Provider gewechselt wird). Aus Gründen der Benutzerfreundlichkeit habe ich den Download schon einmal in einen eigenen Thread ausgelagert.

Mit folgenden Ansätzen gab es bis jetzt leider kein weiterkommen:

Der Download kann nicht abgebrochen werden, weil dies über den Rückgabewert der Methode .OnProgress geschehen muss, die ab und an von urlDownloadToFile aufgerufen wird. Sobald die Verbindung aber abbricht, wird die Methode auch nicht mehr aufgerufen, sodass ein normaler Abbruch nicht mehr möglich ist.

Den Download-Thread ordnungsgemäß mit Thread.Terminate; Thread.Free; zu beenden funktioniert auch nicht, so sich ja urlDownloadToFile und damit auch der Thread aufgehängt hat.

Es bleibt nur noch den Thread gewaltsam mit TerminateThread (Thread.Handle,Thread.ThreadID); ThreadFree; abzuwürgen, da aber nicht alles ordnungsgemäß beendet wird, funktioniert ein erneuter Downloadversuch mit urlDownloadToFile danach nicht mehr richtig. Wie ich inzwischen herausgefunden habe, liegt dies daran, dass nach dem "Abschuss" des Download-Threads auf die halbfertige Datei auf der Festplatte immer noch zugegriffen wird. Bei einem erneuten Download-Versuch müsste die Datei dann also unter einem anderen Namen gespeichert und die halbfertige Dateileiche liegengelassen werden, was aber sehr unsauber wäre. :(


Grüße,

Mendelsohn

Sir Rufo 13. Jan 2009 18:20

Re: urlDownloadToFile hängt sich bei IP-Wechsel auf
 
Nimm doch mal ...
Delphi-Quellcode:
try
  UrlDownloadToFile( ... );
except
end;
denn bei einer exception hört der Code einfach auf zu laufen, und bei einem Thread bekommt man da nix mit ;)

Leider kein Code dabei, also auch keine weitere Hilfestellung möglich

cu

Oliver

Luckie 13. Jan 2009 18:33

Re: urlDownloadToFile hängt sich bei IP-Wechsel auf
 
Also API -Funktiinen werfen in der Regel keine Exceptions. Ein try-except-Block wird da also nicht viel helfen.

toms 13. Jan 2009 18:40

Re: urlDownloadToFile hängt sich bei IP-Wechsel auf
 
Zitat:

Zitat von Luckie
Also API -Funktiinen werfen in der Regel keine Exceptions. Ein try-except-Block wird da also nicht viel helfen.

Try...Except funktioniert da IMO schon. Auch dürfte GetLastError() einen Fehlercode zurückliefern.

SirThornberry 13. Jan 2009 18:43

Re: urlDownloadToFile hängt sich bei IP-Wechsel auf
 
Funktionieren sollte es schon allerdings wird niemals in den Except-Zweig gesprungen weil die Api-Funktionen in aller Regel über Rückgabewert + GetLastError ihre Fehler kommunizieren und nicht über das Auslösen von Exceptions. :)

Sir Rufo 13. Jan 2009 18:48

Re: urlDownloadToFile hängt sich bei IP-Wechsel auf
 
Da wir auch nicht wissen, was er sonst noch im Thread ausführt, hilft wohl nur noch die Kristallkugel

Mendelsohn 13. Jan 2009 18:53

Re: urlDownloadToFile hängt sich bei IP-Wechsel auf
 
Richtig, es wird leider keine Exception geworfen.

Die gewüschnte Beispiel-Implementierung wäre:

Delphi-Quellcode:
uses classes,urlmon,Dialogs;

type
  TThreadDownload = class (TThread)
  protected
      fileURL,filePath : string;
      procedure Execute; override;
      procedure info;
  public
      downloadSuccess : integer;
      constructor create (url,path : string; suspended : boolean);
      procedure FreeInstance; override;
  end;

implementation

constructor TThreadDownload.create (url,path: string; suspended : boolean);
begin
    inherited create (suspended);

    fileURL := url;
    filePath := path;
end;

procedure TThreadDownload.Execute;
begin
    // Download starten und Ergebnis notieren
    downloadSuccess := urlDownloadToFile (nil,pchar (fileURL),pchar (filePath),0,nil);
end;

procedure TThreadDownload.info;
begin
    showmessage ('Free!');
end;

procedure TThreadDownload.FreeInstance;
begin
    inherited FreeInstance;

    synchronize (info);
end;
für den Download-Thread und

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
//
// Download-Thread starten
//
begin
    Thread1 := TThreadDownload.create ('http://upload.wikimedia.org/wikipedia/en/d/d4/Delphi_Composite.jpg','c:\delphi1.jpg',false);

    Thread1.FreeOnTerminate := true;
end;

procedure TForm1.Button2Click(Sender: TObject);
//
// Kill
//
begin
    // Download-Thread über die WinAPI abschießen
    Thread1.Suspend;
    TerminateThread (Thread1.Handle,Thread1.ThreadID);
    Thread1.Free;
end;
als Test-Beispiel.

Sir Rufo 13. Jan 2009 18:58

Re: urlDownloadToFile hängt sich bei IP-Wechsel auf
 
Eine Exception, die in einem Thread auftaucht, wirst du auch nicht zu Gesicht bekommen, was nicht heisst, dass es sie dort nicht gibt ;)

Wenn du das reproduzieren kannst, dann setz doch einfach mal das try ... except um den downloadbefehl, denn ausser dem würde mir da nichts weiter auffallen.

cu

Oliver

Mendelsohn 13. Jan 2009 19:01

Re: urlDownloadToFile hängt sich bei IP-Wechsel auf
 
Habe ich natürlich auch schon versucht, aber urlDownloadToFile wirft keine Exceptions, sondern reagiert bei Verbindungsabbruch einfach nicht mehr (bzw. ruft .onProgress nicht mehr auf, wenn man ein IBindStatusCallback-Objekt eingebunden hat, um damit mit urlDownloadToFile zu kommunizieren, sodass man den Download auch nicht mit E_ABORT regulär abbrechen könnte).

Sir Rufo 13. Jan 2009 19:10

Re: urlDownloadToFile hängt sich bei IP-Wechsel auf
 
ok, weil ich hätte dir sonst den link mal ans herz gelegt
http://www.delphipraxis.net/internal...downloadtofile


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:06 Uhr.
Seite 1 von 3  1 23      

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