AGB  ·  Datenschutz  ·  Impressum  







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

Frage zu Thread.Destroy und Objekten

Ein Thema von Assertor · begonnen am 8. Dez 2008 · letzter Beitrag vom 8. Dez 2008
Antwort Antwort
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#1

Frage zu Thread.Destroy und Objekten

  Alt 8. Dez 2008, 11:18
Hi,

die Frage ist etwas aber besser Frage ich nochmal nach, um mir Klarheit zu verschaffen:

Wird Threadn.Destroy eines TThread wirklich im Bereich des VCL MainThreads abgewickelt wird? Wenn ich mir im .Destory per GetCurrentThreadID die ID hole, ist diese nicht die des VCL MainThreads.

Was ist denn jetzt der beste, übliche Weg, Objekte für den Thread bereitzustellen und freizugeben? Alles im .Execute oder - so wie ich es seit langem mache - in Threadn.Create (ist ja VCL scope) und .Destroy?

Gruß Assertor
Frederik
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

Re: Frage zu Thread.Destroy und Objekten

  Alt 8. Dez 2008, 12:12
Zitat von Assertor:
Wird Threadn.Destroy eines TThread wirklich im Bereich des VCL MainThreads abgewickelt wird? Wenn ich mir im .Destory per GetCurrentThreadID die ID hole, ist diese nicht die des VCL MainThreads.
TThread.Destroy wird in dem Thread ausgeführt der es aufruft. Und wenn du FreeOnTerminate=True gesetzt hast, dann wird das noch im TThread.ThreadId Thread ausgeführt. Wenn du den Code zwingend im Hauptthread ausführen musst, kannst du OnTerminate ein Event zuweisen das die Arbeit verrichtet. Das Event ist deswegen notwendig, weil CallOnTerminate nicht virtuell ist und die Methode DoTerminate im Thread ausgeführt wird.
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#3

Re: Frage zu Thread.Destroy und Objekten

  Alt 8. Dez 2008, 12:17
Hi Andreas,

danke für das erklären!

Ich habe gerade mal etwas rumgesucht und finde viele Beispiele (z.B. auch im artverwandten Tutorial zu TMREWS und dem zugehörigen CodeCentral Item), wo explizit im Source steht:

Delphi-Quellcode:
destructor TWorkerThread.Destroy;
begin
  Main.ThreadDone; //Legit to call VCL, since we're back in main thread
  inherited;
end;
Das ganze von Justin Swett, inzwischen Sr. QA Engineer bei CG. So etwas verwirrt...

Also die Objekte besser im .Execute erzeugen und freigeben.

Gruß Assertor

Edit: Nachtrag, jetzt sehe ich wieder klar... Wenn das TThread Objekt per .Free freigeben wird, läuft das .Destroy im MainThread Kontext ab, bei FreeOnTerminate innerhalb des Threads. Logisch...
Frederik
  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 08:58 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