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
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
44.353 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)
Ein Therapeut entspricht 1024 Gigapeut.
  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
44.353 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.
Ein Therapeut entspricht 1024 Gigapeut.
  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
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 15:44 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