![]() |
Anwendung sauber beenden, während Thread läuft
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:
Formular
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;
Delphi-Quellcode:
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?
procedure TMyForm.DoOnDings(Parameter);
begin EditDings.Text := Parameter; end; |
AW: Anwendung sauber beenden, während Thread läuft
Wenn die Anwendung beendet wird, dann sollte eigentlich
![]() |
AW: Anwendung sauber beenden, während Thread läuft
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.
|
AW: Anwendung sauber beenden, während Thread läuft
Zitat:
|
AW: Anwendung sauber beenden, während Thread läuft
Zitat:
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). |
AW: Anwendung sauber beenden, während Thread läuft
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.
|
AW: Anwendung sauber beenden, während Thread läuft
VCL-Komponenten sollten einen "ich werde grade gelöscht"-Status besitzen (ComponentState). Diesen könnte dein Thread ja abfragen.
Zitat:
Ist schön, wenn man ständig die Unit Forms einbinden muß, nur wegen diesem Status. :cry: |
AW: Anwendung sauber beenden, während Thread läuft
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; |
AW: Anwendung sauber beenden, während Thread läuft
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. |
AW: Anwendung sauber beenden, während Thread läuft
Aber irgendwie habe ich folgendes noch nicht verstanden:
Willst du jetzt
@himitsu ja, die Eigenschaft ComponentState ist mir gerade auch noch eingefallen, allerdings sollte dieses nicht der Thread abfragen, sondern die Komponente selber |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:19 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