![]() |
Delphi-Version: XE
Prüfen, ob Thread noch Aktiv
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:
Der Versuch "replay.isRunning" schlägt fehl, da Replay erst danach erstellt wird.
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; 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 |
AW: Prüfen, ob Thread noch Aktiv
Delphi-Quellcode:
bringt hier absolug garnichts, da durch
assigned (replay)
Delphi-Quellcode:
ab dem
Replay.FreeOnTerminate:=true
Delphi-Quellcode:
dieser Referenzzeiger als "ungültig" zu betrachten ist, weil der niemals auf nil gesetzt wird, aber die Instanz sich "irgendwann" selbst zerstört.
Replay.start;
[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. |
AW: Prüfen, ob Thread noch Aktiv
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. |
AW: Prüfen, ob Thread noch Aktiv
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). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz