AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Prüfen, ob Thread noch Aktiv

Ein Thema von Metschu · begonnen am 18. Okt 2014 · letzter Beitrag vom 19. Okt 2014
Antwort Antwort
Metschu

Registriert seit: 31. Dez 2006
151 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

Prüfen, ob Thread noch Aktiv

  Alt 18. Okt 2014, 21:30
Delphi-Version: XE
Hallo zusammen,

ich habe da ein kleines Problem mit den Threads. Dieser wird über einen Button gestartet und über den selber auch wieder beendet.
Dies klappt beim ersten mal. Wenn ich den Thread ein zweites mal starten möchte, lande ich wieder beim Beenden, also in der Else-Abteilung...

Hier der Code dazu:

Delphi-Quellcode:
procedure TTrapo_II_Form.ReplayProc(Sender: TObject);
begin;
 if not assigned (replay)// replay = NIL <- als Test mit dem gleichen Ergebnis
  then begin;
   opendialog.Filter := 'PSM Logdaten|*.clg';
   opendialog.InitialDir := extractfilepath(application.ExeName)+'Daten\Aufzeichnungen\';
   if opendialog.Execute
    then begin;
     replay := TReplay_Thread.Create(true);
     replay.pfad := opendialog.FileName;
     Replay.Priority := tpIdle;
     Replay.FreeOnTerminate := true;
     Replay.start;
    end;
    replayBtn.ImageIndex := 7;
    replayBtn.Caption :=' Anhalten';
  end
  else begin;
    replay.Terminate;
    replayBtn.ImageIndex:=5;
  end;
end;
Der Versuch "replay.isRunning" schlägt fehl, da Replay erst danach erstellt wird.
Wie kann ich "Replay" im Else Zweig so aus dem Speicher bekommen, das ich beim nächsten klick wieder Starten kann ?

Danke schonmal.

Gruß

Torsten
Torsten
Ich kam, sah und alles Funktionierte.
Dann klingelte mein Wecker...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Prüfen, ob Thread noch Aktiv

  Alt 18. Okt 2014, 23:40
assigned (replay) bringt hier absolug garnichts, da durch Replay.FreeOnTerminate:=true ab dem Replay.start; dieser Referenzzeiger als "ungültig" zu betrachten ist, weil der niemals auf nil gesetzt wird, aber die Instanz sich "irgendwann" selbst zerstört.

[edit]
Der Thread muß natürlich nicht immer aktiv sein, aber die TThread-Instanz darf sich nicht freigeben, wenn man sie von extern steuern will,
oder man muß das über eine zusätzliche Variable steuern, welche der Thread entsprechend umschreibt, bevor er sich verabschiedet.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (19. Okt 2014 um 06:47 Uhr)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#3

AW: Prüfen, ob Thread noch Aktiv

  Alt 19. Okt 2014, 05:41
Ich würde den Thread immer am Leben lassen, aber seine Aufgabe über ein TEvent steuern. D.h. der Thread wartet im Execute, bis das Event signalisiert wird, erfüllt seine Aufgabe und wartet dann wieder.

Es gibt reichlich Beispiele hier, wie man das macht. Einfach mal suchen.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Prüfen, ob Thread noch Aktiv

  Alt 19. Okt 2014, 09:26
Wie Dejan Vu schon korrekt angemerkt hat liegt der größte Fehler in der Sichtweise beim Arbeiten mit Threads.

Ein Thread ist ein Ausführungs-Kontext. Punkt - mehr nicht!

So ein Thread kann eine Aufgabe (Task) ausführen, damit der Hauptthread (aha, noch ein Thread) dadurch nicht belastet wird, denn die Aufgabe des Hauptthreads besteht in der Kommunikation mit dem Anwender.

Vergleichen kann man das mit einem Unternehmen. Da gibt es die Mitarbeiter (Threads) und die erledigen Aufgaben (Tasks). Was mich interessiert ist nicht ob ein Mitarbeiter aufhört (ich bin nicht vom Personalwesen), sondern ob die Aufgabe erledigt wurde.

Das Konstrukt aus dem Ausgangspost könnte man wie folgt darstellen:
Ich stelle einen Mitarbeiter für genau eine Aufgabe ein und wenn der diese Aufgabe erledigt hat, dann kann er sich wieder schleichen (FreeOnTerminate) So, den Erwin habe ich dafür gewonnen und der geht auch fröhlich an sein Werk. Nach einer gewissen Zeit rufe ich dann Erwin .... aber da kommt keine Antwort. Der Erwin ist einfach schon nach Hause gegangen.

In Delphi XE7 ist das jetzt (endlich aber noch nicht abschließend) integriert. Da gibt es ThreadPools (die Personalabteilung) und Tasks (Aufgaben). Man erstellt einfach nur noch Aufgaben (Tasks) und die Personalabteilung (ThreadPool) kümmert sich darum, dass genügend Mitarbeiter (Threads) vorhanden sind abhängig von den verfügbaren Ressourcen (Auslastung der CPU).
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  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 10:55 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