AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Thread nach Terminate wieder starten
Thema durchsuchen
Ansicht
Themen-Optionen

Thread nach Terminate wieder starten

Ein Thema von Alex_ITA01 · begonnen am 2. Okt 2012 · letzter Beitrag vom 2. Okt 2012
Antwort Antwort
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#1

Thread nach Terminate wieder starten

  Alt 2. Okt 2012, 16:11
Hallo zusammen,
ich stehe grad bisschen auf dem Schlauch aber ich wollte hierzu dann doch mal nachfragen.

Wenn ich einen Thread habe, der eine "while not Terminated"-Schleife im Execute Teil abarbeitet und dann aus irgendeinen Grund, terminiert wird, kann man diesen Thread dann irgendwie wieder neustarten?
Die Thread-Instanz ist nach dem Terminate nicht NIL.

Kann man da einfach .Resume wieder ausführen oder ist dies nach einem Terminate-Event nicht mehr möglich?

Delphi-Quellcode:
procedure TMyThread.Execute;
begin
  FreeOnTerminate := False;

  while not Terminated do
  begin
    //Tue irgendwas...
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  MyThread := TMyThread.Create(False); //Execute sofort ausführen
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  MyThread.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  MyThread.Terminate;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  //MyThread.Resume;
  //Hier den Thread wieder starten (Execute wieder durchlaufen) obwohl vorher Terminiert
end;
Anbei bisschen Beispielcode.
MyThread ist global deklariert. Reihenfolge der Button Clicks wäre erst 1 dann 2.
Ist nur ein Beispiel und ohne sinnvollen Inhalt

Gruß
Alex
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#2

AW: Thread nach Terminate wieder starten

  Alt 2. Okt 2012, 16:19
Nein, das geht nicht - und sollte es doch gehen, würde ich es nicht empfehlen.

Bei einem Terminate wird die private Variable FTerminated auf true gesetzt und kann über protected property Terminated abgefragt werden. Es gibt aber keine Stelle, wo das FTerminated auf false gesetzt wird, außer implizit im constructor.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Thread nach Terminate wieder starten

  Alt 2. Okt 2012, 16:23
Geht kein .Suspend?
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#4

AW: Thread nach Terminate wieder starten

  Alt 2. Okt 2012, 16:27
Delphi-Quellcode:
procedure TThread.Terminate;
begin
  if FExternalThread then
    raise EThread.CreateRes(@SThreadExternalTerminate);
  FTerminated := True;
end;
@Uwe: Das habe ich auch grad beim lesen entdeckt...

@nuclearping: Angenommen er beendet sich aber nicht wie in meinem Beispiel durch den Aufruf von .Terminate sondern weil in der Execute-Methode ein "Fehler" drinne ist, dann beendet sich der Thread selbstständig an dieser Stelle. Ist nur ein Beispiel, deswegen würde Suspend nicht gehen.

Bevor jetzt große Unruhe aufkommt: Ich weiß, es sollte sowieso kein Fehler in der Execute Methode vorhanden sein aber vielleicht gibt es ja eine ganz ungünstige Situation die nur 1x pro Monat auftritt, welche dann wiederum zum Fehler führt. Ist wie gesagt nur ein Beispiel und darauf bezog sich meine Frage. Aber anscheind geht das wirklich nicht, schade...

Gruß
Alex
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#5

AW: Thread nach Terminate wieder starten

  Alt 2. Okt 2012, 16:37
und dann aus irgendeinen Grund, terminiert wird,
Und welcher Grund?

Delphi-Quellcode:
procedure TMyThread.InternalExecute;
begin
  while not Terminated do
  begin
    //Tue irgendwas...
  end;
end;

procedure TMyThread.Execute;
begin
  try
    InternalExecute;
  except
    // Exception innerhalb eines Threads abfangen und protokollieren
    on E:Exception do
    begin
      logger.LogError('TMyThread terminated with exception: '+E.Classname+','+E.Message);
    end;
  end;
end;
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#6

AW: Thread nach Terminate wieder starten

  Alt 2. Okt 2012, 16:41
Am Einfachsten du gibst die alte Instanz frei und erstellst eine Neue, welche gestartet wird.

Wenn eine Exception auftrat, dann ist der Zustand diese TThread-Instanz (deren Felder/Variablen) eh nicht unbedingt in einem definierten Zustand, womit man da besser ganz neu anfangen sollte.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  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 18:14 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