AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Programm schließen und Thread beenden (ohne .WaitFor) - alles "sauber"?
Thema durchsuchen
Ansicht
Themen-Optionen

Programm schließen und Thread beenden (ohne .WaitFor) - alles "sauber"?

Offene Frage von "Rob09"
Ein Thema von Rob09 · begonnen am 8. Okt 2011
Antwort Antwort
Rob09

Registriert seit: 14. Aug 2007
58 Beiträge
 
Delphi 6 Personal
 
#1

Programm schließen und Thread beenden (ohne .WaitFor) - alles "sauber"?

  Alt 8. Okt 2011, 14:52
Delphi-Version: 6
Hi!

Also, ich habe einen Arbeitsthread am laufen. Wenn der Benutzer das Hauptfenster schließt, soll dieser beendet werden - und zwar ohne merkliche Verzögerung! Dazu schreibe ich einfach ein MyThread.Terminate in das OnClose-Event des Hauptfensters.

Es gilt:

1. MyThread.FreeOnTerminate = True
2. In der Execute-Methode von TMyThread wird auf .Terminate foldendermaßen reagiert:
Delphi-Quellcode:
  if Terminated then
  begin
    CoUninitialize;
    Exit;
  end;
3. Im OnClose/OnCloseQuery des Hauptfensters soll ausdrücklich NICHT
Code:
MyThread.WaitFor
auftauchen, weil CoUninitialize teilweise recht lange braucht und .WaitFor somit zum zeitweisen augenscheinlichen Einfrieren des Hauptfensters führen würde. (Hier eine Lösung mit ner Schleife "while MyThreadRunning do Application.ProcessMessages" kommt auch nicht in Frage, weil sich das Fenster ja ohne große Verzögerung schließen soll)


Nun gibt es in meinem Kopf zwei mögliche Szenarien, was passiert, wenn der Benutzer das Hauptfenster schließt. Das erste in folgendes:

1. Benutzer gibt Schließbefehl
2. Hauptthread signalisiert dem Arbeitsthread das .Terminate
3a. Hauptfenster schließt sich, aber das Programm bleibt am Leben, weil der Arbeitsthread noch läuft
3b. Arbeitsthread führt noch das CoUninitialize aus und zerstört sich danach selbst
4. Anwendung erkennt, dass der Arbeitsthread terminiert hat und beendet sich komplett

Das wäre die "gute" Variante.

Die andere denkbare Möglichkeit wäre die:

1. "
2. "
3. Hauptfenster schließt sich, wobei die Anwendung komplett beendet wird, ohne Rücksicht darauf, dass der Arbeitsthread noch läuft

Ob dabei noch rechtzeitig CoUninitialize aufgerufen wird, kann man nicht sagen. Und was passiert, wenn es aufgerufen wurde, aber noch nicht fertig ist, erst recht nicht. Und ob es wirklich schadet, wenn das CoUninitialize am Ende des Programms nicht aufgerufen wird, weiß ich übrigens auch nicht (d.h. ob die COM Library beim Ende des Prozesses automatisch freigegeben wird).

Es wäre super, wenn jemand ein wenig Klarheit in die Sache bringen könnte. Die Frage ist übrigens eng hiermit verknüpft: http://www.delphipraxis.net/163566-c...ch-noetig.html

Beste Grüße!
Robert
  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 05:28 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