AGB  ·  Datenschutz  ·  Impressum  







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

Anwendung sauber beenden, während Thread läuft

Ein Thema von DeddyH · begonnen am 3. Feb 2012 · letzter Beitrag vom 4. Feb 2012
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von DeddyH
DeddyH

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

Anwendung sauber beenden, während Thread läuft

  Alt 3. Feb 2012, 12:01
Ich bastle momentan für einen Bekannten an einer Dateisuch-Komponente. Diese benutzt intern einen Thread, der bei Funden synchronisiert Events abarbeiten lässt. Soweit alles feini, feini. Das Problem, das ich noch habe (ich zeige mal beispielhaften Vergleichscode):
Komponente
Delphi-Quellcode:
type
  TMyThread = class(TThread)
  private
    FOnDings: TDingsEvent;

...

procedure TMyThread.DoOnDings;
begin
  if Assigned(FOnDings) then
    FOnDings(Parameter);
end;

procedure TMyThread.Execute;
begin
  //arbeiten
  if Dings then
    Synchronize(DoOnDings);
end;
Formular
Delphi-Quellcode:
procedure TMyForm.DoOnDings(Parameter);
begin
  EditDings.Text := Parameter;
end;
Wird nun das Programm geschlossen, kann es natürlich passieren, dass das Edit vor meiner Komponente freigegeben wird, während die synchronisierte Methode noch arbeitet. Damit endet der Zugriff auf EditDings logischerweise in einer AV. Natürlich kann man im OnClose des Formulars den Thread terminieren, aber das muss der Anwender meiner Komponente tun, ich hätte das lieber selbst irgendwie geregelt. Leider habe ich keine zündende Idee, momentan habe ich einfach den Aufruf der zugewiesenen Methode innerhalb des Threads in einen try-except-Block gepackt, wobei der Thread im Exception-Fall dann terminiert. Hat jemand einen schöneren Vorschlag?
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
  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
 
#2

AW: Anwendung sauber beenden, während Thread läuft

  Alt 3. Feb 2012, 12:29
Wenn die Anwendung beendet wird, dann sollte eigentlich Delphi-Referenz durchsuchenTApplication.Terminated auf True sein
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
WladiD

Registriert seit: 27. Jan 2006
Ort: Celle
141 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Anwendung sauber beenden, während Thread läuft

  Alt 3. Feb 2012, 12:53
Also wenn dein Thread nicht mit FreeOnTerminate := TRUE läuft, dann reicht ein einfaches DeinThread.Free im OnDestroy des Forms aus und alles wird korrekt beendet.
Waldemar Derr
  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: Anwendung sauber beenden, während Thread läuft

  Alt 3. Feb 2012, 12:55
Also wenn dein Thread nicht mit FreeOnTerminate := TRUE läuft, dann reicht ein einfaches DeinThread.Free im OnDestroy des Forms aus und alles wird korrekt beendet.
Genau das möchte er doch vermeiden!
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
WladiD

Registriert seit: 27. Jan 2006
Ort: Celle
141 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Anwendung sauber beenden, während Thread läuft

  Alt 3. Feb 2012, 13:04
Also wenn dein Thread nicht mit FreeOnTerminate := TRUE läuft, dann reicht ein einfaches DeinThread.Free im OnDestroy des Forms aus und alles wird korrekt beendet.
Genau das möchte er doch vermeiden!
Aha, OK, hab's zu oberflächig gelesen. Aber der Anwender der Komponente muss doch etwas tun: Create und Free muss schon irgendwo im Code sein (ist ja kein TComponent-Nachkömmling). Und wenn FreeOnTerminate := FALSE ist, dann kann die oben genannte Zugriffsverletzung niemals entstehen.

Also man kann sich grundsätzlich niemals darauf verlassen, dass Sychronize erfolgreich ausgeführt wird, da man den Kontext aus dem Thread aus nicht kennen kann (und soll).
Waldemar Derr
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: Anwendung sauber beenden, während Thread läuft

  Alt 3. Feb 2012, 13:14
Vielleicht habe ich mich missverständlich ausgedrückt: Komponente auf Formular, Thread in Komponente. Komponente bekommt Event zugewiesen und schleust das einfach zum Thread durch. Somit führt der Thread eine Methode des Forms aus, auch wenn dieses bereits mit seiner Freigabe begonnen hat. Das im Formular abzufangen ist ja nicht das Thema, nur habe ich darauf keinen Einfluss.
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Anwendung sauber beenden, während Thread läuft

  Alt 3. Feb 2012, 13:23
VCL-Komponenten sollten einen "ich werde grade gelöscht"-Status besitzen (ComponentState). Diesen könnte dein Thread ja abfragen.

Wenn die Anwendung beendet wird, dann sollte eigentlich Delphi-Referenz durchsuchenTApplication.Terminated auf True sein
Wobei ich mir wünschen würde, in der Unis System gäbe es einen Terminated-Boolean und eventuell auch noch ein Event dazu, auf welches man reagieren könnte.

Ist schön, wenn man ständig die Unit Forms einbinden muß, nur wegen diesem Status.
$2B or not $2B
  Mit Zitat antworten Zitat
WladiD

Registriert seit: 27. Jan 2006
Ort: Celle
141 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Anwendung sauber beenden, während Thread läuft

  Alt 3. Feb 2012, 13:30
Na in dem Fall muss die zu synchronisierende Methode nach csDestroying abfragen. In deinem Fall:

Delphi-Quellcode:
procedure TMyForm.DoOnDings(Parameter);
begin
  if not (csDestroying in ComponentState) then
    EditDings.Text := Parameter;
end;
Waldemar Derr
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: Anwendung sauber beenden, während Thread läuft

  Alt 3. Feb 2012, 13:32
An Application.Terminated oder Ähnliches hatte ich auch schon gedacht. Aber es kann ja auch sein, dass die Komponente auf einem dynamisch erzeugten Formular liegt, damit bekäme ich dasselbe Problem, sobald das freigegeben wird, da ja dann die Anwendung trotzdem weiterläuft.

@Wladi: das ist aber wieder Code, der dann im Formular stehen muss.
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
  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
 
#10

AW: Anwendung sauber beenden, während Thread läuft

  Alt 3. Feb 2012, 13:33
Aber irgendwie habe ich folgendes noch nicht verstanden:

Willst du jetzt
  1. eine Komponente (Ableitung von TComponent) entwickeln mit einem darin werkelnden Thread
  2. einen Thread, der auf eine Komponente (TEdit) zugreift
Im Falle von a) wie soll denn der Benutzer den Thread überhaupt beenden können und vor allem sollen? Der Thread sollte dann doch so gekapselt sein, dass man eben nicht direkt an den Thread kommt.

@himitsu
ja, die Eigenschaft ComponentState ist mir gerade auch noch eingefallen, allerdings sollte dieses nicht der Thread abfragen, sondern die Komponente selber
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
Seite 1 von 3  1 23      


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 02:48 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