AGB  ·  Datenschutz  ·  Impressum  







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

CoUninitialize WIRKLICH nötig?

Ein Thema von Rob09 · begonnen am 4. Okt 2011 · letzter Beitrag vom 10. Okt 2011
Antwort Antwort
Seite 1 von 2  1 2      
Rob09

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

CoUninitialize WIRKLICH nötig?

  Alt 4. Okt 2011, 21:05
Delphi-Version: 6
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
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#2

AW: CoUninitialize WIRKLICH nötig?

  Alt 5. Okt 2011, 19:54
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.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)

Geändert von Dezipaitor ( 5. Okt 2011 um 20:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: CoUninitialize WIRKLICH nötig?

  Alt 5. Okt 2011, 19:58
Delphi-Quellcode:
MyThread.WaitFor;
FreeAndNil(MyThread);
Weglassen und den Thread sich selber freigeben lassen? (FreeOnTerminate)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Rob09

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

AW: CoUninitialize WIRKLICH nötig?

  Alt 5. Okt 2011, 21:20
Genial einfach - einfach genial!

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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: CoUninitialize WIRKLICH nötig?

  Alt 5. Okt 2011, 21:39
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.


WinNT züchtet Schlampen heran.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Rob09

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

AW: CoUninitialize WIRKLICH nötig?

  Alt 8. Okt 2011, 17:38
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 :

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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: CoUninitialize WIRKLICH nötig?

  Alt 9. Okt 2011, 01:40
Wenn ich bislang CoInitalize /CoUninitialize gebraucht habe, habe ich das im initialization und finalization-Abschnitt der Unit untergebracht.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Rob09

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

AW: CoUninitialize WIRKLICH nötig?

  Alt 9. Okt 2011, 01:59
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
  Mit Zitat antworten Zitat
Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#9

AW: CoUninitialize WIRKLICH nötig?

  Alt 9. Okt 2011, 02:04
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".

lg.
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.014 Beiträge
 
Delphi 12 Athens
 
#10

AW: CoUninitialize WIRKLICH nötig?

  Alt 9. Okt 2011, 13:36
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".

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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 03:13 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