![]() |
EnumWindows in einem Thread ausführen?
hallo.
ich habe folgendes problem: sobald ich EnumWindows mit einem thread koppel kracht es:
Delphi-Quellcode:
die GetPid funktion wird aufgerufen und am ende gibts dann eine zugriffsverletzung in der ntdll.dll
type
TMyThread = class(TThread) private function GetPid(hHwnd: HWND; lParam : Integer): Boolean; stdcall; protected procedure Execute; override; public constructor Create; virtual; end; constructor TMyThread.Create; begin FreeOnTerminate:=True; inherited Create(false); end; function TMyThread.GetPid(hHwnd: HWND; lParam : Integer): Boolean; stdcall; begin if (hHwnd=0) then Result:=False else Result:=True; //code gekürzt aber kracht ja trozdem ;-) end; procedure TMyThread.Execute; begin while not Terminated do begin EnumWindows(@TMyThread.GetPid, 0); Sleep(5000); end; end; dachte dann noch, dass evtl. die deklaration in den public teil muss, damit windows auf die callback funktion zugreifen kann aber das ändert auch nichts :-(. sobald ich die funktion aus dem thread nehme klappt es. ich will aber auf thread interne variablen zugreifen... jemand ne idee? |
Re: EnumWindows in einem Thread ausführen?
Du musst wohl zwischen Methode und Funktion unterscheiden. Ich vermute EnumWindows hätte gern eine Funktion.
|
Re: EnumWindows in einem Thread ausführen?
kann ich denn irgendwie eine threadinterne funktion daraus bauen?
bzw. ist doch eigentlich eine funktion?! |
Re: EnumWindows in einem Thread ausführen?
Nein, das ist eine Methode.
Threadintern hängt allein von deiner Programmierung ab. Die Funktion/Methode muss nicht in der Klasse TThread sein. Du kannst also die Methode aus der Klasse herauslösen und eine extra Funktion nehmen oder du nimmst eine Klassenfunktion. Letzteres sieht meist vom Programmaufbau her besser aus. |
Re: EnumWindows in einem Thread ausführen?
Delphi-Quellcode:
stürzt immer noch ab :-(
type
TMyThread = class(TThread) protected procedure Execute; override; public constructor Create; virtual; class function GetPid(hHwnd: HWND; lParam : Integer): Boolean; stdcall; end; constructor TMyThread.Create; begin FreeOnTerminate:=True; inherited Create(false); end; class function TMyThread.GetPid(hHwnd: HWND; lParam : Integer): Boolean; stdcall; begin if (hHwnd=0) then Result:=False else Result:=True; //code gekürzt aber kracht ja trozdem ;-) end; procedure TMyThread.Execute; begin while not Terminated do begin EnumWindows(@TMyThread.GetPid, 0); Sleep(5000); end; end; |
Re: EnumWindows in einem Thread ausführen?
|
Re: EnumWindows in einem Thread ausführen?
danke für den super link. werde ich mir zu gemüte führen und behandelt ja auch exakt mein problem :-)
|
Re: EnumWindows in einem Thread ausführen?
Sorry, Klassenmethode geht nicht, weil die hat ja auch einen versteckten Parameter.
Dann eben eine nomrale Funktion. Falls du auf deine Threadklasse zugreifen willst, brauchst du aber nicht dne Umstand machen, den dir Luckie zeigt. Hier hast du ja einen freien Parameter (lparam) um self zu übergeben. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:57 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