Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Threads beenden?
jackie05 - Di 08.11.11 21:26
Titel: Threads beenden?
Hallo,
ich habe folgendes problem und zwar, versuche ich schon mehrere Stunden meine Threads zu beenden.
Es funktioniert einfach nicht, ich möchte den Thread nur beenden, nicht (löschen bzw. freigeben).
Delphi-Quelltext
1:
| DownloadThread[Liste.ItemIndex].Terminate |
funktioniert nicht, ich hab auch sehr viel gegoogelt und ich verstehe es einfach nicht, wie es so schwer sein kann den Thread zu beenden.
Ich bedanke mich schonmal im Voraus.
MfG
HenryHux - Di 08.11.11 21:30
Was passiert denn im Thread?
Du könntest noch das Terminate im Thread selber abfragen und ihn dann beenden.
jackie05 - Di 08.11.11 21:35
Danke Dir für die antwort.
Ich hab ein Downloadtool geschrieben und möchte einfach das man auch den Download abbrechen kann.
Ich möchte nur den Thread vorzeitig beenden, aber wenn ich versuche es zu beenden, dann läuft er trotzdem weiter.
Wie mache ich das ambesten in meinem TDownloadThread.Execute?
Danke schonmal.
MfG
Delete - Di 08.11.11 21:59
Ohne Code lässt sich nur raten, wie man die Threads am besten beenden kann. Normalerweise gibt es in der Execute Methode eine Endlosschleife in der man die Eigenschaft Terminated abfragt und so lange diese Eigenschaft nicht wahr ist, wird die Schleife weiter ausgeführt. Von außen kann man dann diese Eigenschaft auf Wahr setzen, die Schleife wird beendet und mit Verlassen der Execute Methode beendet sich dann auch der Thread.
jackie05 - Di 08.11.11 22:43
Hier ist die Execute procedure:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| procedure TDownloadThread.Execute; var Buchstaben: string; i: integer; begin inc(running);
try HTTP := TIdHTTP.Create(nil); HTTP.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)'; HTTP.HandleRedirects := true; HTTP.OnWork:=HTTPWork; HTTP.OnWorkBegin:=HTTPWorkBegin; Speed := 0; DownloadAktiv := true;
fs := TFileStream.Create(Output+Titel+'.'+FileFormat,fmCreate); HTTP.Get(DownloadURL,fs); HTTP.Free; fs.Free;
if (VideoEncodieren = false) then begin DownloadThread[ID].DownloadAktiv := false; end else begin Synchronize(ffmpegStarten); end; except DownloadThread[ID].DownloadAktiv := false; end;
dec(running); end; |
Danke schonmal.
MfG
HenryHux - Di 08.11.11 23:10
Delphi-Quelltext
1:
| if terminated then exit; |
Müsste funktionieren, wenn du es an passender Stelle einsetzt.
jackie05 - Di 08.11.11 23:16
Das funktioniert auch nicht.
Da IdHTTP erst zuende läuft, kann ich es auch nicht irgendwohin platzieren, es würde garnix nützen.
Gibt es keine andere möglichkeit?
MfG
Delete - Di 08.11.11 23:29
Du kannst den Thread im OnWork Ereigniss abbrechen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| type TDemoForm = class(TForm) ... private Canceled: boolean; ... end;
procedure TDemoForm.CancelClick(Sender: TObject); begin Canceled := true; end;
procedure TDemoForm.HTTPWork(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); begin if Canceled then Abort; end;
procedure TDemoForm.DownloadClick(Sender: TObject); var fs: TFileStream; fn: TFileName; begin fn := 'c:\daten\abort.txt'; fs := TFileStream.Create(fn, fmCreate); Canceled := false; try HTTP.Get('http://www.amazon.de', fs); except end; fs.Free; if Canceled then DeleteFile(fn); end; |
Der Download wird abgebrochen und die Execute Methode verlassen.
Hat mich übrigens nur zwei Minuten Recherche im Internet gekostet. :roll:
jackie05 - Di 08.11.11 23:56
Ich hab in diesem Moment garnicht daran gedacht dieser Download bei OnWork abzubrechen.
Funktioniert, vielen Dank für die Hilfe.
MfG
baka0815 - Mi 09.11.11 10:28
PS:
jackie05 hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| if (VideoEncodieren = false) then begin DownloadThread[ID].DownloadAktiv := false; end else begin Synchronize(ffmpegStarten); end; |
|
Das ist schlechter Stil und kann u.U. nicht funktionieren.
Mach's lieber so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| if (not VideoEncodieren) then begin DownloadThread[ID].DownloadAktiv := false; end else begin Synchronize(ffmpegStarten); end; |
Oder gleich
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| if (VideoEncodieren) then begin Synchronize(ffmpegStarten); end else begin DownloadThread[ID].DownloadAktiv := false; end; |
jackie05 - Mi 09.11.11 13:10
Vielen Dank, ich habs gleich geändert.
Noch eine Frage:
Wenn ich manchmal einen Thread Pausiere, dann friert mein ganzes Programm ein und kann dann nix mehr machen, außer Programm neu starten.
So pausiere ich mein Thread:
Delphi-Quelltext
1:
| DownloadThread[Liste.ItemIndex].Suspend; |
Woran könnte das Problem liegen?
MfG
Nersgatt - Mi 09.11.11 13:44
Vermutlich hast Du einen Deadlock produziert. Sowas ist dann schwer zu finden, daher sollte man auf Suspend verzichten, wenn es möglich ist.
jackie05 - Do 10.11.11 12:50
Ich werde versuchen, das irgendwie anders zu lösen, vielen Dank.
MfG
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!