Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi CoUninitialize WIRKLICH nötig? (https://www.delphipraxis.net/163566-couninitialize-wirklich-noetig.html)

Rob09 4. Okt 2011 21:05

Delphi-Version: 6

CoUninitialize WIRKLICH nötig?
 
Hi!

Ich benutze einen Thread, der im Prinzip simpel aussieht und folgendes macht:

Delphi-Quellcode:
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;
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.

Das war bisher so gelöst:

Delphi-Quellcode:
procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin

  ...

  MyThread.Terminate; //***
  MyThread.WaitFor;  //***
  FreeAndNil(MyThread);

end;
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.

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

Dezipaitor 5. Okt 2011 19:54

AW: CoUninitialize WIRKLICH nötig?
 
Nach http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
zu deuten, kann es schonmal etwas länger dauern. Du kannst aber auch einfach dein eigenes WaitFor schreiben, wie ich es mit
http://jwscldoc.delphi-jedi.net/TJwT...D@Boolean.html
gemacht habe.

himitsu 5. Okt 2011 19:58

AW: CoUninitialize WIRKLICH nötig?
 
Delphi-Quellcode:
MyThread.WaitFor;
FreeAndNil(MyThread);
Weglassen und den Thread sich selber freigeben lassen? (FreeOnTerminate)

Rob09 5. Okt 2011 21:20

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?

himitsu 5. Okt 2011 21:39

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.

Rob09 8. Okt 2011 17:38

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

Christian Seehase 9. Okt 2011 01:40

AW: CoUninitialize WIRKLICH nötig?
 
Wenn ich bislang CoInitalize /CoUninitialize gebraucht habe, habe ich das im initialization und finalization-Abschnitt der Unit untergebracht.

Rob09 9. Okt 2011 01:59

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: http://www.delphipraxis.net/162151-i...coxmlhttp.html).

Gruß!
Robert

Astat 9. Okt 2011 02:04

AW: CoUninitialize WIRKLICH nötig?
 
Zitat:

Zitat von Rob09 (Beitrag 1129360)
Wird die COM library beim Beenden des Anwendungsprozesses automatisch freigegeben, sodass es nicht nötig ist, CoUninitialize am Ende des Programms aufzurufen?

Ja, wenn deine App wirklich beendet wurde, räumt das OS alles und jedes auf, ausgenommen natürlich Ring0 Treiber, die aus dem USER Mode "behandelt werden". 8-)

lg.

Uwe Raabe 9. Okt 2011 13:36

AW: CoUninitialize WIRKLICH nötig?
 
Zitat:

Zitat von Astat (Beitrag 1129397)
Zitat:

Zitat von Rob09 (Beitrag 1129360)
Wird die COM library beim Beenden des Anwendungsprozesses automatisch freigegeben, sodass es nicht nötig ist, CoUninitialize am Ende des Programms aufzurufen?

Ja, wenn deine App wirklich beendet wurde, räumt das OS alles und jedes auf, ausgenommen natürlich Ring0 Treiber, die aus dem USER Mode "behandelt werden". 8-)

lg.

Damit sind aber nicht alle COM-spezifischen Aktivitäten abgedeckt. Laut MSDN bewirkt CoUninitialize:

Zitat:

Closes the COM library on the current thread, unloads all DLLs loaded by the thread, frees any other resources that the thread maintains, and forces all RPC connections on the thread to close.
Das mindeste, was ich mir hier vorstellen kann, ist, daß die Referenzzähler einiger DLLs durcheinandergeraten. Die wirklich schlimmen Sachen kann ich mir aber wahrscheinlich noch gar nicht vorstellen.

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 05:38 Uhr.
Seite 1 von 2  1 2      

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