AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi urlDownloadToFile hängt sich bei IP-Wechsel auf
Thema durchsuchen
Ansicht
Themen-Optionen

urlDownloadToFile hängt sich bei IP-Wechsel auf

Ein Thema von Mendelsohn · begonnen am 13. Jan 2009 · letzter Beitrag vom 24. Jun 2009
Antwort Antwort
Seite 1 von 3  1 23      
Mendelsohn

Registriert seit: 13. Jan 2009
9 Beiträge
 
#1

urlDownloadToFile hängt sich bei IP-Wechsel auf

  Alt 13. Jan 2009, 19:13
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
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

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

  Alt 13. Jan 2009, 19:20
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

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

  Alt 13. Jan 2009, 19:33
Also API -Funktiinen werfen in der Regel keine Exceptions. Ein try-except-Block wird da also nicht viel helfen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#4

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

  Alt 13. Jan 2009, 19:40
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.
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

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

  Alt 13. Jan 2009, 19:43
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

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

  Alt 13. Jan 2009, 19:48
Da wir auch nicht wissen, was er sonst noch im Thread ausführt, hilft wohl nur noch die Kristallkugel
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Mendelsohn

Registriert seit: 13. Jan 2009
9 Beiträge
 
#7

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

  Alt 13. Jan 2009, 19:53
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

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

  Alt 13. Jan 2009, 19:58
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Mendelsohn

Registriert seit: 13. Jan 2009
9 Beiträge
 
#9

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

  Alt 13. Jan 2009, 20:01
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).
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

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

  Alt 13. Jan 2009, 20:10
ok, weil ich hätte dir sonst den link mal ans herz gelegt
http://www.delphipraxis.net/internal...downloadtofile
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:22 Uhr.
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