AGB  ·  Datenschutz  ·  Impressum  







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

Thread nicht terminiert?

Ein Thema von mcinternet · begonnen am 1. Feb 2013 · letzter Beitrag vom 1. Feb 2013
Antwort Antwort
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.784 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: Thread nicht terminiert?

  Alt 1. Feb 2013, 10:40
.. wenn der Thread mit freeOnTerminate gestartet wurde
und im laufenden Thread ann die Execute Methode verlassen wird,
dann ist er terminiert - nicht nil aber beendet.

Das sollte auch im TaskManager verfolgbar sein.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
mcinternet

Registriert seit: 22. Apr 2010
Ort: Odenwald
193 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Thread nicht terminiert?

  Alt 1. Feb 2013, 10:54
.. wenn der Thread mit freeOnTerminate gestartet wurde
und im laufenden Thread ann die Execute Methode verlassen wird,
dann ist er terminiert - nicht nil aber beendet.

Das sollte auch im TaskManager verfolgbar sein.

Grüße
Klaus
Wie kann ich das nun am elegantesten lösen, das das Ding auch gekillt wird?

im OnTerminate ein free... oder destroy?

Gruss
Jörg
Jörg
  Mit Zitat antworten Zitat
sahimba

Registriert seit: 14. Nov 2011
Ort: Berlin, Hauptstadt der DDR
137 Beiträge
 
Delphi 10 Seattle Professional
 
#3

AW: Thread nicht terminiert?

  Alt 1. Feb 2013, 11:07
Was willst Du denn noch "killen" bei FreeOnTerminate = True, wenn der Thread seine Execute-Methode beendet hat? Er ist dann terminiert und wird automagisch freigegeben.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

AW: Thread nicht terminiert?

  Alt 1. Feb 2013, 11:17
Du hast es anscheinend noch nicht verstanden. Der Thread ist terminiert. Nur das Threadobjekt selber ist nicht nil.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.666 Beiträge
 
Delphi 12 Athens
 
#5

AW: Thread nicht terminiert?

  Alt 1. Feb 2013, 11:17
Wenn Thread terminiert, threadaktiv auf false und MThread auf nil setzen. Vor einem Zugriff auf MThread dann eins dieser beiden im Vorfeld prüfen.
Delphi-Quellcode:
if Assigned(MThread) then
  MThread.MachIrgendwas;

//oder
if threadaktiv then
  MThread.MachIrgendwas;
[edit] Siehe wilder Zeiger [/edit]

[edit2] Oh, Beitrags-Schnapszahl, ich geb virtuell einen aus [/edit2]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH ( 1. Feb 2013 um 11:26 Uhr)
  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
 
#6

AW: Thread nicht terminiert?

  Alt 1. Feb 2013, 11:24
Mal abgesehen davon, dass du globale Variablen benutzt, mit dem Thread in die VCL (nicht threadsafe!) reingreifst, deprecated Methoden benutzt (Resume) ...

Stell dir vor ich gebe dir meine Visitenkarte wo meine Adresse drauf steht.
Lasse ich jetzt das Haus abreissen und du schaust danach dort vorbei, dann gibt es dort nichts mehr, auch wenn die Adresse auf der Visitenkarte mit goldenen Lettern geprägt und Parfüm beduftet wurde.

Eine Objekt-Variable speichert nur die Referenz auf ein Objekt (also die Adresse) und wenn das Objekt nicht mehr da ist, dann hat die Objekt-Variable immer noch die Adresse auch wenn es dort nichts zu finden gibt.
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
mcinternet

Registriert seit: 22. Apr 2010
Ort: Odenwald
193 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Thread nicht terminiert?

  Alt 1. Feb 2013, 11:30
jetzt hat´s geklingelt

Vielen Dank
Jörg
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#8

AW: Thread nicht terminiert?

  Alt 1. Feb 2013, 11:59
Von hinten durch die Brust ins Auge:
Delphi-Quellcode:
procedure TMyThread.Execute;
var
   dynform : TFrmGMaps;
begin
  dynform := TFrmGMaps(Application.FindComponent(FrmMain.GmapThreadname));
  // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Der Thread braucht offensichtlich ein TFrmGMaps-Objekt für seine Arbeit.
Dann wäre es sehr sinnvoll, wenn man dem Thread dieses Objekt von Aussen geben würde.
Dadurch, dass der Thread sich diese Info selbst besorgen muss, entsteht ein Kuddelmuddel.
Der Thread braucht und soll die Objekte "Application" und "FrmMain" nicht kennen.
Delphi-Quellcode:
TMyThread = class(TThread)
public
   dynform : TFrmGMaps; // NEU <====
   procedure execute; override;
end;

procedure TFrmGMaps.btn_querystartClick(Sender: TObject);
...
begin
...
// und Erzeugen sieht dann so aus
  MThread := TMyThread.Create(True);
  MThread.FreeOnTerminate := True;
  MThread.OnTerminate := threadend;
  MThread.dynform := self; // <===

Geändert von sx2008 ( 1. Feb 2013 um 18:33 Uhr)
  Mit Zitat antworten Zitat
mcinternet

Registriert seit: 22. Apr 2010
Ort: Odenwald
193 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Thread nicht terminiert?

  Alt 1. Feb 2013, 12:03
Von hinten durch die Brust ins Auge:
Delphi-Quellcode:
procedure TMyThread.Execute;
var
   dynform : TFrmGMaps;
begin
  dynform := TFrmGMaps(Application.FindComponent(FrmMain.GmapThreadname));
  // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Der Thread braucht offensichtlich ein TFrmGMaps-Objekt für seine Arbeit.
Dann wäre es sehr sinnvoll, wenn man dem Thread dieses Objekt von Aussen geben würde.
Dadurch, dass der Thread sich diese Info selbst besorgen muss, entsteht ein Kuddelmuddel.
Der Thread braucht und soll die Objekte "Application" und "FrmMain" nicht kennen.
Delphi-Quellcode:
TMyThread = class(TThread)
public
   dynform : TFrmGMaps;
   procedure execute; override;
end;

procedure TFrmGMaps.btn_querystartClick(Sender: TObject);
...
begin
...
// und Erzeugen sieht dann so aus
  MThread := TMyThread.Create(True);
  MThread.FreeOnTerminate := True;
  MThread.OnTerminate := threadend;
  MThread.dynform := self; // <===
// ^^^^^^^^^^^^^^ => Fehler
Wird nicht gefunden

Mit einer globalen Var und dann: dynform := TFrmGMaps(Application.findcomponent(threadname)); geht es ...
Warum nicht Application. x..... ?

Gruss
MC
Jörg

Geändert von mcinternet ( 1. Feb 2013 um 12:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#10

AW: Thread nicht terminiert?

  Alt 1. Feb 2013, 19:21
Mit einer globalen Var und dann: dynform := TFrmGMaps(Application.findcomponent(threadname)); geht es ...
Warum nicht Application. x..... ?
Du hast bestimmt schon gehört, dass man globale Variablen vermeiden soll.
Dafür gibt es mehrere Gründe; die vollständige Liste kann ich leider nur auf Englisch anbieten:
http://c2.com/cgi/wiki?GlobalVariablesAreBad
Globale Variablen sind sozusagen das Gegenteil von Objekt-orientierter-Programmierung bei der man versucht, alle Aspekte möglichst lokal zu behandeln. (Stichwort: Datenkapselung)
Wird nicht gefunden
Du hast bestimmt vergessen die Klasse "TMyThread" zu erweitern.
Delphi-Quellcode:
TMyThread = class(TThread)
public
   dynform : TFrmGMaps; // <== das fehlt bei dir
   procedure execute; override;
end;
Hier noch das Grundprinzip:
Bevor ein Thread gestartet wird, gibt man ihm von Aussen alle Informationen, die er braucht.
Der Thread kann sich dann ganz auf seine Aufgabe konzentrieren; er braucht nicht Application.FindComponent aufrufen, weil er sämliche Infos (Objekte, Daten, Werte) schon beim Start bekommen hat.
  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 16:44 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