Autor Beitrag
jackie05
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 357



BeitragVerfasst: 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).

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 357



BeitragVerfasst: 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



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 357



BeitragVerfasst: Di 08.11.11 22:43 
Hier ist die Execute procedure:
ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Di 08.11.11 23:10 
ausblenden Delphi-Quelltext
1:
if terminated then exit;					

Müsste funktionieren, wenn du es an passender Stelle einsetzt.
jackie05 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 357



BeitragVerfasst: 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



BeitragVerfasst: Di 08.11.11 23:29 
Du kannst den Thread im OnWork Ereigniss abbrechen:
ausblenden volle Höhe 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; // Datei freigeben
  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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 357



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: Mi 09.11.11 10:28 
PS:
user profile iconjackie05 hat folgendes geschrieben Zum zitierten Posting springen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
    if (VideoEncodieren = falsethen
    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:
ausblenden 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
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
    if (VideoEncodieren) then
    begin
      Synchronize(ffmpegStarten);
    end
    else begin
      DownloadThread[ID].DownloadAktiv := false;
    end;
jackie05 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 357



BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
DownloadThread[Liste.ItemIndex].Suspend;					


Woran könnte das Problem liegen?

MfG
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 357



BeitragVerfasst: Do 10.11.11 12:50 
Ich werde versuchen, das irgendwie anders zu lösen, vielen Dank.

MfG