Autor |
Beitrag |
jackie05
      
Beiträge: 357
|
Verfasst: Di 08.11.11 21:26
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
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: 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 
      
Beiträge: 357
|
Verfasst: 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
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
      
Beiträge: 357
|
Verfasst: Di 08.11.11 22:43
Hier ist die Execute procedure:
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
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: Di 08.11.11 23:10
Delphi-Quelltext 1:
| if terminated then exit; |
Müsste funktionieren, wenn du es an passender Stelle einsetzt.
|
|
jackie05 
      
Beiträge: 357
|
Verfasst: 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
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 08.11.11 23:29
Du kannst den Thread im OnWork Ereigniss abbrechen:
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. 
|
|
jackie05 
      
Beiträge: 357
|
Verfasst: 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
      
Beiträge: 489
Erhaltene Danke: 14
Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
|
Verfasst: Mi 09.11.11 10:28
|
|
jackie05 
      
Beiträge: 357
|
Verfasst: 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
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: 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.
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
jackie05 
      
Beiträge: 357
|
Verfasst: Do 10.11.11 12:50
Ich werde versuchen, das irgendwie anders zu lösen, vielen Dank.
MfG
|
|