![]() |
Prozess wird nicht beendet
Wenn ich folgende Methode in einem VCL Thread habe
Delphi-Quellcode:
...und der Thread läuft, wird der Prozess beim Schließen des Hauptfensters nicht beendet. Obwohl laut Nico in diesem Posting
function TRegNotifier.WatchRegKey(ARoot: HKEY; AKey: string): DWORD;
var err : DWORD; hEvent : THandle; hndlkey : HKEY; begin // create event, that is signaled by RegNotifyChangeKeyValue hEvent := CreateEvent(nil, False, False, nil); if (hEvent <> 0) and not Terminated then begin err := RegConnectRegistry(nil, ARoot, hndlkey); if (err = 0) and not Terminated then begin err := RegOpenKeyEx(hndlkey, PChar(AKey), 0, KEY_NOTIFY, hndlkey); if (err = 0) and not Terminated then begin // start monitoring the specific key err := RegNotifyChangeKeyValue(hndlkey, True, REG_NOTIFY_CHANGE_LAST_SET, hEvent, False); if Assigned(OnRegKeyChanged) then begin FOnRegKeyChanged(self); end; if err <> ERROR_SUCCESS then begin if Assigned(OnRegNotifierError) then FOnRegNotifierError(self, err, SysErrorMessage(err)); Terminate; end; RegCloseKey(hndlkey); end // RegOpenKey else begin if Assigned(OnRegNotifierError) then FOnRegNotifierError(self, err, SysErrorMessage(err)); Terminate; end; end // RegConnectRegistry else begin if Assigned(OnRegNotifierError) then FOnRegNotifierError(self, err, SysErrorMessage(err)); Terminate; end; end else err := GetLastError; // return last error result := err; end; ![]() Aber warum tut er das bei mir nicht? |
Re: Prozess wird nicht beendet
Liste der Anhänge anzeigen (Anzahl: 1)
Kannst du bitte mal das angehängte Projekt ausprobieren und alle unnötigen Packages deaktivieren...
|
Re: Prozess wird nicht beendet
Hier an der Arbeit hab eich kein 7zip. Könnte es also erst zu Hause heute Abend probieren.
|
Re: Prozess wird nicht beendet
Zitat:
Hab's als Zip hochgeladen. |
Re: Prozess wird nicht beendet
Ja ja ja. Ich bin froh, dass die mir einen Rechner gegeben haben der überhaupt einigermaßen läuft. Abzüglich des Sharedmemory der Grafikkarte habe ich noch 480 MB für XP, VS, Firefox und was man sonst noch so am Laufen hat.
So, dein Code funktioniert. Was war denn jetzt mein fehler, dass der Thread nicht beendet wurde? PS: Meine schöne Klasse total umgekrämpelt. :cry: |
Re: Prozess wird nicht beendet
Zitat:
...ich kann dein Problem mit deiner Klasse auf meinem Rechner nicht nachvollziehen - vielleicht benutze ich sie einfach anders (edit: vielleicht liegt's aber auch an RegConnectRegistry). Zitat:
OK, eigentlich habe ich nur versucht meine Klasse an deine Vorlage anzupassen :D |
Re: Prozess wird nicht beendet
Zitat:
Aber ich hatte sowieso vergessen die Ereignisse zu synchronisieren. ;) Ich habe gesehen, dass du beim Beenden das Objekt gar nicht frei gibst. Und wenn ich das jetzt so mache:
Delphi-Quellcode:
Dann reagiert das Fenster auf einmal nicht mehr. :gruebel:
{*
* Procedure: TForm1.Button1Click * Start monitoring * Author : michael.puff * Date : 2006-03-10 *} procedure TForm1.Button1Click(Sender: TObject); begin RegNotifier := TRegNotifier.Create(HKEY_LOCAL_MACHINE, LMKEY); with RegNotifier do begin OnRegKeyChanged := Self.OnRegKeyChanged; OnRegKeyFailure := Self.OnRegKeyFailure; Resume(); end; end; {* * Procedure: TForm1.Button2Click * Stop monitoring * Author : michael.puff * Date : 2006-03-10 *} procedure TForm1.Button2Click(Sender: TObject); begin if Assigned(RegNotifier) then begin FreeAndNil(RegNotifier); end; end; Neue Erkenntnis: Und wenn ich den Code von Button2Click im OnDestroy des Formulares habe, dann wird der Prozess auch nicht beendet. |
Re: Prozess wird nicht beendet
Zitat:
ps: warum sollte man die Klasse im Destroy nutzen... |
Re: Prozess wird nicht beendet
Hm, OK auch wieder war. Aber was mache ich, wenn ich die Überwachung unterbrechen will mit einem Button Klick?
|
Re: Prozess wird nicht beendet
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:14 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