Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi EnumWindows in einem Thread ausführen? (https://www.delphipraxis.net/130323-enumwindows-einem-thread-ausfuehren.html)

Cyberstorm 6. Mär 2009 13:07


EnumWindows in einem Thread ausführen?
 
hallo.

ich habe folgendes problem:

sobald ich EnumWindows mit einem thread koppel kracht es:

Delphi-Quellcode:
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;
die GetPid funktion wird aufgerufen und am ende gibts dann eine zugriffsverletzung in der ntdll.dll
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?

sirius 6. Mär 2009 13:12

Re: EnumWindows in einem Thread ausführen?
 
Du musst wohl zwischen Methode und Funktion unterscheiden. Ich vermute EnumWindows hätte gern eine Funktion.

Cyberstorm 6. Mär 2009 13:20

Re: EnumWindows in einem Thread ausführen?
 
kann ich denn irgendwie eine threadinterne funktion daraus bauen?

bzw. ist doch eigentlich eine funktion?!

sirius 6. Mär 2009 13:23

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.

Cyberstorm 6. Mär 2009 13:32

Re: EnumWindows in einem Thread ausführen?
 
Delphi-Quellcode:
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;
stürzt immer noch ab :-(

Luckie 6. Mär 2009 13:36

Re: EnumWindows in einem Thread ausführen?
 
Es ist ja auch immer noch eine Methode.

http://www.michael-puff.de/Artikel/CallbackMethod.shtml

Cyberstorm 6. Mär 2009 13:40

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 :-)

sirius 6. Mär 2009 14:03

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 16:16 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