![]() |
indy idhttp + download abbrechen
Hallo zusammen,
ich versuche in meinem Download Manager eine idhttp Verbindung abzubrechen. Um mein Ziel zu erreichen verwende ich ![]() Download und breche dieses ab. Danach wird auch die Verbindung abgebrochen und das File gelöscht. Problem wenn ich dann einen neuen link anklicke um eine Datei aus meinem Programm runterzuladen, wird mir eine Pointer Exception ausgeschmissen. Konkret an dieser stelle:
Delphi-Quellcode:
Den Unterschied den ich habe ist das ich ein finally habe anstatt ein except und eine Schleife im try block ist.procedure TForm2.display(); var typ : String; name : String; link : String; begin //abbrechen ist in dem fall das cancel aus dem vorigen Post. abbrechen := false; //Progressbar wird auf 0 gesetzt (Reset) und der link geholt ProgressBar1.Position := 0; link := self.getLink(); //wenn der link ungleich leer ist, zeige die Details an if (link <> '')then begin IdHTTPblub.Head(link); //Hier tritt die Exception auf, das erstemal wenn die idHttpblub wieder angesprochen wird nachdem //Abbruch.
Delphi-Quellcode:
Das funktioniert auch soweit aber, danach kommt der aufruf von oben display() den ich per klick auf einen weiteren link ausführe und ich bekomme die Pointer Exception sobald ich idHttpblubtry repeat // Damit sich das Programm nicht aufhängt Application.ProcessMessages; //Nun setzen wir den Start nach den bereits kopierten Bytes IdHTTPblub.Request.ContentRangeStart := BytesKopiert; //Hier wird geprüft ob die restlichen Bytes größer sind als cFileSplitSize if (BytesInsgesamt-BytesKopiert) > cFileSplitSize then begin //Hier wird einmal die cFileSplitSize eingestellt (die Konstante) IdHTTPblub.Request.ContentRangeEnd := BytesKopiert+cFileSplitSize-1; end //Den Rest der Datei else IdHTTPblub.Request.ContentRangeEnd := BytesInsgesamt; Application.ProcessMessages; //Den eingestellten Teil herunterladen und in die Datei speichern IdHTTPblub.Get(link, lStream); //Progress und Status aktualisieren ProgressBar1.Position := BytesKopiert; //BytesKopiert weiter setzen BytesKopiert := BytesKopiert+cFileSplitSize; until (BytesKopiert >= BytesInsgesamt); //Schleife beenden wenn datei fertig finally if Assigned(lStream) then lStream.Free; //FileStream freigeben wenn gesetzt if (abbrechen = true) then deleteFile(pfadundDatei); //wenn abbrechen true ist wird datei gelöscht end; anspreche. Hat jemand eine Ahnung wie es dazu kommt? Oder vielleicht ist die lösung um eine idhttp Connection abzubrechen auch nicht so günstig gewählt. Und ich sollte vielleicht eine andere nehmen? greetz Lun |
Re: indy idhttp + download abbrechen
Hallo,
du schreibst, dass eine Exception geworfen wird bei:
Delphi-Quellcode:
Was ist das für eine Exception? Hast du vielleicht die HTTP-Komponente zwischendurch versehentlich freigegeben?
// ...
IdHTTPblub.Head(link); // ... Grüße vom marabu |
Re: indy idhttp + download abbrechen
Hi marabu,
erstmal thx für deine antwort. Eine Debugger Exception tritt auf "Zugriffsverletzung bei Adresse 00406118 bei Lesen von Adresse 00000004" Die HTTP - Komponente habe ich nicht freigegeben, ich weiß nicht genau was abort für eine Wirkung hat. Vielleicht gibt der aufruf die komponente frei? greetz Lun P.S: suche gerade auch nochmal in der Suche nach abort. |
Re: indy idhttp + download abbrechen
Da wird auf jeden fall auf etwas nicht initialisiertes zugegriffen. Irgendwo scheint da "nil" im Spiel zu sein.
|
Re: indy idhttp + download abbrechen
Wenn die HTTP-Komponente niemals erzeugt worden wäre, dann wäre ihr Zeigerwert NIL und würde einen Error-Offset 0 produzieren. Ich vermute eher, dass die Komponente völlig unabsichtlich freigegeben wurde - eventuell versteckt in einer WITH-Klausel. Das Werfen einer stummen Ausnahme mittels Abort() bewirkt direkt keine Freigabe, aber vielleicht der umhüllende exception handler?
Freundliche Grüße |
Re: indy idhttp + download abbrechen
Hi @ll,
also das Problem liegt explizit an der Zeile
Delphi-Quellcode:
Wenn ich nämlich vorher mal das setzte:
IdHTTPblub.Head(link);
Delphi-Quellcode:
holt er mir die version des alten idhttpblub objects. Anscheinend kann man nach dem abort nicht mehr richtig auf den head eines neuen links (datei) zugreifen, hat jemand eine Ahnung warum?
version := idhttpblub.Response.ContentVersion;
ShowMessage(version); damit funktioniert es genau einmal, und danach reagiert er nicht mehr auf das abort. sprich er bricht den download nicht mehr ab, die exceptions sind dann weg.
Delphi-Quellcode:
Thema ist erledigt, das Zauberwort war idhttpdblub.DestroyComponents;
idhttpdblub.Destroying;
idhttpdbblub := Tidhttp.Create; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:42 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