AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi indy idhttp + download abbrechen
Thema durchsuchen
Ansicht
Themen-Optionen

indy idhttp + download abbrechen

Ein Thema von Lun · begonnen am 19. Dez 2006 · letzter Beitrag vom 19. Dez 2006
Antwort Antwort
Benutzerbild von Lun
Lun

Registriert seit: 4. Feb 2006
122 Beiträge
 
Delphi 2005 Professional
 
#1

indy idhttp + download abbrechen

  Alt 19. Dez 2006, 10:06
Hallo zusammen,

ich versuche in meinem Download Manager eine idhttp Verbindung abzubrechen. Um mein Ziel zu erreichen verwende ich diese Möglichkeit. Das funktioniert soweit auch, also ich lade etwas beim ersten mal erfolgreich runter, danach starte ich ein
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:

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.
Den Unterschied den ich habe ist das ich ein finally habe anstatt ein except und eine Schleife im try block ist.

Delphi-Quellcode:

try
    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;
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 idHttpblub
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: indy idhttp + download abbrechen

  Alt 19. Dez 2006, 11:00
Hallo,

du schreibst, dass eine Exception geworfen wird bei:

Delphi-Quellcode:
// ...
    IdHTTPblub.Head(link);
// ...
Was ist das für eine Exception? Hast du vielleicht die HTTP-Komponente zwischendurch versehentlich freigegeben?

Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von Lun
Lun

Registriert seit: 4. Feb 2006
122 Beiträge
 
Delphi 2005 Professional
 
#3

Re: indy idhttp + download abbrechen

  Alt 19. Dez 2006, 11:29
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.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: indy idhttp + download abbrechen

  Alt 19. Dez 2006, 11:31
Da wird auf jeden fall auf etwas nicht initialisiertes zugegriffen. Irgendwo scheint da "nil" im Spiel zu sein.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: indy idhttp + download abbrechen

  Alt 19. Dez 2006, 11:44
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
  Mit Zitat antworten Zitat
Benutzerbild von Lun
Lun

Registriert seit: 4. Feb 2006
122 Beiträge
 
Delphi 2005 Professional
 
#6

Re: indy idhttp + download abbrechen

  Alt 19. Dez 2006, 14:36
Hi @ll,

also das Problem liegt explizit an der Zeile

IdHTTPblub.Head(link); Wenn ich nämlich vorher mal das setzte:
Delphi-Quellcode:
version := idhttpblub.Response.ContentVersion;
ShowMessage(version);
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?


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:
idhttpdblub.Destroying;
idhttpdbblub := Tidhttp.Create;
Thema ist erledigt, das Zauberwort war idhttpdblub.DestroyComponents;
  Mit Zitat antworten Zitat
Antwort Antwort


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 10:00 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