![]() |
Re: urlDownloadToFile hängt sich bei IP-Wechsel auf
Wie gesagt, ohne das onProgress aufgerufen wird, funktioniert auch kein E_ABORT mehr.
Gibt es eine Möglichkeit die Datei nach dem Abschuss des Download-Threads von den Resten des Zugriffs von urlDownloadToFile zu befreien, sodass es möglich ist, die Dateileiche zu löschen und den Download danach mit demselben Dateinamen zu wiederholen? |
Re: urlDownloadToFile hängt sich bei IP-Wechsel auf
Nun ich habe das Problem inzwischen dadurch "gelöst", indem ich statt dem verbuggeten Microsoft/Borland urlDownloadToFile bzw. TDownLoadURL Zeug mir eine neue Thread-Download Klasse auf Basis der Indys geschrieben haben, die mit HTTP get arbeitet. Also falls jemand mal ein ähnliches Problem hat, versucht es damit:
Delphi-Quellcode:
Ein Implementations-Beispiel wäre:
unit ThreadDownload;
interface uses classes, IdHTTP; type TThreadDownload = class (TThread) protected totalSize : cardinal; fileURL : string; statusMessage : string; HTTP : TIdHTTP; Content : TFilestream; procedure Execute; override; public isDownloading : boolean; constructor create (url,path : string); procedure cancel; function getActualSize : cardinal; function getTotalSize : cardinal; function getStatusMessage : string; function getDownloadSuccess : boolean; procedure FreeInstance; override; end; implementation constructor TThreadDownload.create (url,path: string); // // Object Initialization // begin // signalize the download-thread is running isDownloading := true; fileURL := url; Content := TFilestream.Create (path,fmcreate); HTTP := TIdHTTP.Create; inherited create (false); end; procedure TThreadDownload.Execute; // // Thread // begin statusMessage := 'Verbinde'; // get filesize HTTP.Head (fileURL); totalSize := HTTP.Response.ContentLength; statusMessage := 'Download gestartet'; HTTP.Get (fileURL,Content); statusMessage := 'Download beendet'; // signalize the download-thread was stopped isDownloading := false; end; procedure TThreadDownload.cancel; // // cancels the download // begin HTTP.Disconnect; statusMessage := 'Download abgebrochen'; // signalize the download-thread was stopped isDownloading := false; end; function TThreadDownload.getActualSize : cardinal; // // returns the number of bytes already downloaded // begin result := Content.Position; end; function TThreadDownload.getTotalSize : cardinal; // // returns the file's size in byte // begin result := totalSize; end; function TThreadDownload.getStatusMessage : string; // // returns the actual status-message // begin result := statusMessage; end; function TThreadDownload.getDownloadSuccess : boolean; // // is true if the file was completely downloaded // begin if (Content.Position = totalSize) then result := true else result := false; end; procedure TThreadDownload.FreeInstance; // // Garbage Collection // begin Content.Free; HTTP.Free; inherited FreeInstance; end; end.
Delphi-Quellcode:
Das cancel hier macht keine Zicken und der Thread lässt sich danach auch anstandslos beenden und die Dateileiche wird freigegeben. Mithilfe von getActualSize und getTotalSize kann man sich die aktuelle Geschwindigkeit berechnen und so im Falle eines Verbindungsabbruchs, IP-Wechsels, ect. wenn die Geschwindigkeit eine gewisse Zeig lang bei 0 lag, den Download dann automatisch abbrechen und wiederholen.
procedure TForm1.Button1Click(Sender: TObject);
// // downlad [url]http://upload.wikimedia.org/wikipedia/en/d/d4/Delphi_Composite.jpg[/url] // var url,path : string; begin url := 'http://upload.wikimedia.org/wikipedia/en/d/d4/Delphi_Composite.jpg'; path := 'c:\Delphi.jpg'; DownloadThread := TThreadDownload.create (url,path); DownloadThread.FreeOnTerminate := false; while (DownloadThread.isDownloading) do begin sleep (100); Application.ProcessMessages; end; showmessage ('Done!'); DownloadThread.Free; end; procedure TForm1.Button2Click(Sender: TObject); // // cancel download // begin DownloadThread.cancel; end; |
Re: urlDownloadToFile hängt sich bei IP-Wechsel auf
Was ist das:
Delphi-Quellcode:
Warum löst dein Thread kein Ereignis aus, wenn er fertig ist und warum löst er kein Fortschrittsereignis aus?
while (DownloadThread.isDownloading) do
begin sleep (100); Application.ProcessMessages; end; |
Re: urlDownloadToFile hängt sich bei IP-Wechsel auf
Zitat:
Das
Delphi-Quellcode:
ist dazu da, die Programmausführung zu unterbrechen bis der Thread die Datei fertig heruntergeladen hat, ohne die Benutzeroberfläche von Form1 einzufrieren.
while (DownloadThread.isDownloading) do
begin sleep (100); Application.ProcessMessages; end; |
Re: urlDownloadToFile hängt sich bei IP-Wechsel auf
Zitat:
Zitat:
Zitat:
Ich glaube, du solltest dich mal mit der objektorientierten Programmierung auseinandersetzen. |
Re: urlDownloadToFile hängt sich bei IP-Wechsel auf
Zitat:
Aber in dem eigentlichen Programm, in dem ich diese Thread-Klasse einsetze, gibt es kein simples showmessage, sondern es sollen in einer Schleife mehrere Dinge, unter anderem ein paar Downloads, nacheinander abgearbeitet werden. Wenn ich statt einfach zu warten bis der Download fertig ist, das onTerminate-Ereignis verwende, dann müsste ich die ganze Schleife auseinander nehmen und in zwei Teile (bis TThreadDownload.create und dann wieder ab der Methode die OnTerminate zugewiesen ist) spalten. |
Re: urlDownloadToFile hängt sich bei IP-Wechsel auf
hallo zusammen...
ich bin auch auf eine ähnliches problem gestossen wie das das Mendelsohn hatte und zwar das nach einem abbruch meines Threads über TerminateThread die datei die mittels TDownloadURL gerade geladen wurde nicht gelöscht werden kann da wenn ich den thread beende die onProgress prozedur noch läuft... Free funktioniert an keiner stelle (ausser der DL ist beendet)... gibts denn wirklich keinen weg die dateileiche irgendwie frei zu bekommen?! ich weis ich könnte jetzt auch seine lösung versuchen oder das programm einfach mit parametern restarten und das file dann löschen aber ich wollte bevor ich zu diesen mitteln greife noch mal sicherheitshalber fragen ob sich da nicht doch etwas vor mir verbirgt :wink: lg paperboy |
Re: urlDownloadToFile hängt sich bei IP-Wechsel auf
in dem Thread wird die Datei ja geöffnet und wenn du den Thread hart beendest, dann gibt er diese Datei nicht mehr frei, das passiert nur, wenn der gesamte Prozess beendet wird (dann macht es Windows für dich).
|
Re: urlDownloadToFile hängt sich bei IP-Wechsel auf
hey himitsu,
danke erstmal für die antwort... in bezug zu meinem anderen thread gibt es also keine "einfache" möglichkeit diese windwos funktion zu emulieren so das ich mein prog nicht erst abschiessen muss? oder gibt es vllt auch eine möglichkeit die datei freizubekommen bevor ich meinen thread abschiesse ohne warten zu müssen das der DL fertig wird? wie gesagt er steckt ja beim beenden grad in der OnDownlaodProgress prozedur... lg paperboy |
Re: urlDownloadToFile hängt sich bei IP-Wechsel auf
wenn es im eigenem Prozess ist, dann gäre es zwar eine "Möglichkeit"
![]() Allerdings müßtest du damit alle möglichen Handles einzeln prüfen (auch jene, welche grad nicht in Benutzung sind, da es halt keine "leicht" zugängliche und einheitliche Liste mit allen Handle gibt) und schauen, ob das Handle zur Datei gehört. Dazu kommt noch, daß diese Funktion nicht immer funktioniert und unter verschiedenen Umständen keine Informationen liefert und selbst wenn Infos ausgelesen können, kann es sein, daß das Format des Dateinamens nicht einfach zu interpretieren ist. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:36 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