![]() |
Delphi-Version: 6
CoUninitialize WIRKLICH nötig?
Hi!
Ich benutze einen Thread, der im Prinzip simpel aussieht und folgendes macht:
Delphi-Quellcode:
Nun möchte ich - falls der Benutzer das Hauptfenster schließt - gerne den Thread ohne Rücksicht auf Verluste abbrechen und das Programm ohne Verzögerung schließen.
procedure TMyThread.Execute;
begin CoInitialize; while ... do if Terminated then begin CoUninitialize; Exit; end; Arbeite(...); // Hier wird gearbeitet, u.a. Websites abgerufen mit IXMLHTTPRequest bzw. CoXMLHTTP (muss zugeben, dass ich den Code zusammengesucht habe und nicht wirklich was davon verstehe) end; CoUninitialize; end; Das war bisher so gelöst:
Delphi-Quellcode:
Mit der obigen Lösung kommt es aber vor, dass das Hauptfenster dann für einige Zeit (bis zu ~30s) einfriert, bevor es geschlossen wird.
procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin ... MyThread.Terminate; //*** MyThread.WaitFor; //*** FreeAndNil(MyThread); end; Wenn ich die beiden mit //*** gekennzeichenten Zeilen weglasse, dann wird das Programm ohne Fehlermeldung wie gewünscht sofort geschlossen. Allerdings wird dabei dann nicht mehr CoUninitialize aufgerufen. Spielt das denn überhaupt noch eine Rolle? Schließlich wird mein Prozess ja ohnehin gekillt... Schonmal Danke für eure Hilfe! Robert |
AW: CoUninitialize WIRKLICH nötig?
Nach
![]() zu deuten, kann es schonmal etwas länger dauern. Du kannst aber auch einfach dein eigenes WaitFor schreiben, wie ich es mit ![]() gemacht habe. |
AW: CoUninitialize WIRKLICH nötig?
Delphi-Quellcode:
Weglassen und den Thread sich selber freigeben lassen? (FreeOnTerminate)
MyThread.WaitFor;
FreeAndNil(MyThread); |
AW: CoUninitialize WIRKLICH nötig?
Genial einfach - einfach genial! :thumb:
Vielen Dank für den "Denkanschubser", so funktionierts wie gewünscht! Beste Grüße und Danke euch beiden! Robert PS: Nur mal aus Interesse... Würde es tatsächlich "schaden", wenn ein Programm beendet wird, ohne vorher das nötige CoUninitialize aufzurufen? |
AW: CoUninitialize WIRKLICH nötig?
Sagen wir es mal so: Etwas aufräumen kann nicht schaden.
Selbst wenn windows vieles frei git, wenn die App geschlossen wird, kann man ja dennoch selber seinen Mist wegräumen, so wie man ja auch wärend der Programmlaufzeit alles fein säuberlich aufräumt. :angle: WinNT züchtet Schlampen heran. |
AW: CoUninitialize WIRKLICH nötig?
Das sehe ich prinzipiell genauso, himitsu. Aber wenn es einem ausnahmsweise mal das Leben wesentlich leichter macht, kann man ja mal im Einzelfall drauf verzichten. Deshalb noch ein letzter Versuch :wink: :
Wird die COM library beim Beenden des Anwendungsprozesses automatisch freigegeben, sodass es nicht nötig ist, CoUninitialize am Ende des Programms aufzurufen? Beste Grüße! Robert |
AW: CoUninitialize WIRKLICH nötig?
Wenn ich bislang CoInitalize /CoUninitialize gebraucht habe, habe ich das im initialization und finalization-Abschnitt der Unit untergebracht.
|
AW: CoUninitialize WIRKLICH nötig?
Das geht aber leider nicht, wenn man auf die COM library innerhalb eines separaten Threads zugreifen möchte, da dann das CoInitialize (und CoUninitialize) vom betreffenden Thread aufgerufen werden muss (habe ich hier gelernt:
![]() Gruß! Robert |
AW: CoUninitialize WIRKLICH nötig?
Zitat:
lg. |
AW: CoUninitialize WIRKLICH nötig?
Zitat:
Zitat:
Nehmen wir aber mal an, man könnte CoUninitialize einfach weglassen. Wer garantiert denn, daß das beim nächsten Windows-Update oder bei der nächsten Windows-Version auch so bleibt? MS wird dir sicher nicht gesondert mitteilen, daß du CoUninitialize dann jetzt aber wirklich aufrufen musst. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:49 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