![]() |
idhttp.get methode sicher abbrechen!
tach'chen leutz,
ich hab jetz ein problem, bei dem ich verzweifle, ich sitz daran schon 2 tage. es geht darum ein laufendes idhttp.get abzubrechen,was ja auch irgendwie gehen sollte. nur schnall ich net wie! das ganze läuft über einen thread (TThread), und der http.get aufruf ist try-except gekapselt. gibts den da keine methode mit der ich idhttp.get sicher abbrechen kann? ich weis nich mehr weiter. stueckchen code ist hier. es funktioniert eigentlich alles, ich darf bloß nicht waerend des downloads den close button des forms anklicken. da kommt ne haessliche exception in der IDE und ne meldung illegale zeiger operation wenn ich das prog ohne IDE starte.
Delphi-Quellcode:
procedure TMyThread.Execute;
var Datei: TFIleStream; temppath:String[255]; begin try //das was im Thead ausgeführt werden soll //temppath:=GetEnvironmentVariable('TEMP'); Datei:=TFileStream.create(Anwendungspfad+'test.exe',fmCreate); form1.IdHttp1.Get('http://blablabla/biohazard.jpg',Datei); except Datei.free; end; end; |
Re: idhttp.get methode sicher abbrechen!
Hi!
Im Ereignis OnWork kannst du bei einem gewünschten Abbruch Disconnect aufrufen. Dem Thread solltest du aber seine eigene TIdHTTP Instanz geben.
Delphi-Quellcode:
type
TMyThread = class(TThread) private Downloader: TIdHTTP; procedure CustomOnWork(Sender: TObject{...hier die gleichen Parameter wie in OnWork} ); public Aborted: Boolean; procedure Execute; override; constructor Create; {Hier TIdHTTP Instanz erzeugen...} destructor Destroy; override; {... und wieder freigeben} end; |
Re: idhttp.get methode sicher abbrechen!
hi Dani,
kannst du mir das genauer erläutern, was du mit thread eigener iphttp instanz meinst, und wie so was geht. *keinen schimmer hab* :stupid: |
Re: idhttp.get methode sicher abbrechen!
Klar gerne, ich hab hier bei der 'Arbeit' aber kein Delphi zum testen, daher alle Angaben ohne Gewähr :mrgreen:
Jeder Thread sollte sein eigenes TIdHTTP-Objekt haben, was sich doppelt positiv auswirkt. Keine Zugriffsverletzungen mehr, weil Thread und Formular nicht aufeinander zugreifen und flüssige Programmausführung trotz Blocking Sockets. Durch die Verwendung von Blocking Sockets werden auch keine unnötigen, zusätzlichen Threads erzeugt.
Delphi-Quellcode:
Edit: Um die hässlichen Zugriffsverletzungen beim Beenden zu unterbinden musst du im OnClose bzw. OnCloseQuery alle Threads terminieren (und warten, bis sie terminiert sind). Ich hab es damals so gelöst, dass beim ersten Klick auf close die Threads "freundlich" zum terminieren aufgefordert werden ( MyThread.Terminate ). Und beim zweiten mal hart terminiert werden (TerminateThread(MyThread.Handle)). Zusätzich kannst du auf
type
TDownloadThread = class(TThread) private Downloader: TIdHTTP; //Thread-Eigener Downloader procedure CustomOnWork(Sender: TObject; AThread: TIdConnectionThread; AWorkCount: Cardinal); {Hat evtl anders formulierte Parameter} public Aborted: Boolean; constructor Create(CreateSuspended: Boolean = false); destructor Destroy; override; procedure Execute; override; end; implementation {TDownloadThread} constructor TDownloadThread.Create(CreateSuspended: Boolean = false); begin inherited Create(true); Aborted := false; //Eigenen Downloader erzeugen Downloader := TIdHTTP.Create; with Downloader do begin //Einstellungen ändern (Connect Timeouts usw..) {...} //Eigene OnWork Methode mit Abbruchsmöglichkeit zuweisen OnWork := CustomOnWork; end; {Habe Thread erstmal Suspended erstellt, weil ich nicht sicher bin, ob sonst sofort Execute aufgerufen wird - evtl korrigieren} If not CreateSuspended then Resume; end; procedure CustomOnWork(Sender: TObject; AThread: TIdConnectionThread; AWorkCount: Cardinal); begin If Aborted then AThread.Connection.Disconnect; end; destructor TDownloadThread.Destroy; begin Downloader.Free; end; procedure TDownloadThread.Execute; begin try Downloader.Get(SomeURL); except DeleteFile(SomeFile); end; end; ![]() |
Re: idhttp.get methode sicher abbrechen!
*seuftz*
oh je Dani, so viel unbekannte begriffe. kannst du mir vielleicht noch erklaeren was blocking sockets sind und wozu sie eingesetz werden :? |
Re: idhttp.get methode sicher abbrechen!
![]() ===> threadblocking |
Re: idhttp.get methode sicher abbrechen!
Und, hat's funktioniert? [erledigt]? :zwinker:
|
Re: idhttp.get methode sicher abbrechen!
hi Dani,
ich hab das jetz ganz anders geloest, aber mich wuerde echt interressieren, was so tool daran sein soll, das ein blocking socket paket den thread lahm legt in dem es lauft? die hilfe auf die du mich verwiesen hast ist leider englisch. so etwas ist schon in deutsch schwer zu verstehenm wenn du dich das erste mal damit beschaeftigst :gruebel: |
Re: idhttp.get methode sicher abbrechen!
Ja wie bricht man das nun richtig ab?
Die IdHTTP Instanz blockiert den Thread in dem sie aufgerufen wurde und dies solange bis IdHTTP den Get Process beendet hat (TimeOut) dann gehts wieder weiter im Thread. Jo und Lösung ums SOFORT abzubrechen? |
Re: idhttp.get methode sicher abbrechen!
Keiner ne Ahnung? Habe auch im Inet per google gesucht.. nix gefunden!
Mir scheint die TIdHTTP ist von TIdTCPClient abgeleitet. Ein DisconnectSocket bricht leider nicht den Verbindungsaufbau ab! Bei TIdTCPClient geht das aber, mein ich. Wieso gehts net in TIdHTTP ? :shock: :freak: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:22 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