![]() |
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 |
Re: urlDownloadToFile hängt sich bei IP-Wechsel auf
Nimm doch mal ...
Delphi-Quellcode:
denn bei einer exception hört der Code einfach auf zu laufen, und bei einem Thread bekommt man da nix mit ;)
try
UrlDownloadToFile( ... ); except end; Leider kein Code dabei, also auch keine weitere Hilfestellung möglich cu Oliver |
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.
|
Re: urlDownloadToFile hängt sich bei IP-Wechsel auf
Zitat:
|
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. :)
|
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
|
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:
für den Download-Thread und
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;
Delphi-Quellcode:
als Test-Beispiel.
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; |
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 |
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).
|
Re: urlDownloadToFile hängt sich bei IP-Wechsel auf
ok, weil ich hätte dir sonst den link mal ans herz gelegt
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:35 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