Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi mehrere funktionsparameter bei beginthread übergeben? (https://www.delphipraxis.net/130439-mehrere-funktionsparameter-bei-beginthread-uebergeben.html)

Luckie 8. Mär 2009 22:36

Re: mehrere funktionsparameter bei beginthread übergeben?
 
Zitat:

Zitat von sirius
Und man kan die Threadfunction aucvh gleich asl Methode der zugehörigen Klasse nehmen:

Hast du das schon mal so gemacht?

sirius 9. Mär 2009 10:36

Re: mehrere funktionsparameter bei beginthread übergeben?
 
Zitat:

Zitat von Luckie
Zitat:

Zitat von sirius
Und man kan die Threadfunction aucvh gleich asl Methode der zugehörigen Klasse nehmen:

Hast du das schon mal so gemacht?

Ja.
Delphi-Quellcode:
//Hier als Aufsatz für die Klasse TDirectory, welche (im Constrcutor) ein Verzeichnis samt Unterverzeichnisse durchforstet
//und dafür bekanntlich ein Weilchen braucht:

type
  TSearchThread=class
      Constructor Create(aParent: TDirectory; const aName:String;
                            aFileNotify:TFileNotify=nil;
                            aOnFinished:TDirectoryNotify=nil); reintroduce;
      Destructor Destroy; override;
    private
      FName:string;
      FNotify:TFileNotify;
      FWnd:Hwnd;
      FParent:TDirectory;
      FThreadID:Cardinal;
      FonFinished:TDirectoryNotify;
      procedure WndProc(var Message:TMessage);
      procedure Notify(aFile:TFile);
      function ThreadProc:Integer;
      procedure DoNotify(aFile:TFile);
  end;

...


constructor TSearchThread.Create(aParent:TDirectory; const aName: String;
  aFileNotify: TFileNotify; aOnFinished:TDirectoryNotify);
begin
  inherited Create;
  FParent:=aParent;
  FName:=aName;
  FOnFinished:=aOnFinished;
  FNotify:=aFileNotify;
  Fwnd:=Classes.AllocateHWnd(WndProc);
  BeginThread(nil,0,@TSearchThread.ThreadProc,self,0,FThreadID); //Here you are ;-)
end;

destructor TSearchThread.Destroy;
begin
  Classes.DeallocateHWnd(Fwnd);
  inherited;
end;

procedure TSearchThread.DoNotify(aFile: TFile);
begin
  if assigned(FNotify) then
    FNotify(aFile);
end;

procedure TSearchThread.Notify(aFile: TFile);
begin
  if assigned(FNotify) then sendmessage(Fwnd,WM_User,0,integer(aFile));
end;

function TSearchThread.ThreadProc: Integer;
var temp:TFileNotify;
begin
  if assigned(FNotify) then temp:=Notify
                       else temp:=nil;
  FParent.Create(FName,temp);
  PostMessage(Fwnd,WM_Close,0,0);
  result:=0;
end;

procedure TSearchThread.WndProc(var Message: TMessage);
begin
  case Message.msg of
    WM_User: DoNotify(TFile(Message.LParam));
    WM_Close: begin
      try
        if assigned(FOnFinished) then FOnFinished(self.FParent);
      finally
        self.Free;
      end;
    end;
    else
      DefWindowProc(Fwnd,Message.Msg,Message.WParam,Message.LParam);
  end;
end;


//Und der Start des Threads aus TDirectory:
constructor TDirectory.CreateThreaded          
            (const aName: String;          //Verzeichnispfad
             aFileNotify: TFileNotify;     //Ereignis beim Finden einer neuen Datei
             aOnFinished:TDirectoryNotify); //Ereignis, wenn die Suche beendet ist
begin
  TSearchThread.Create(self,aName,aFileNotify,aOnFinished);
end;

Luckie 9. Mär 2009 10:41

Re: mehrere funktionsparameter bei beginthread übergeben?
 
Ich frage nur, weil in BeginThread ja ein Funktionszeiger benötigt wird und kein Methodenzeiger.

sirius 9. Mär 2009 10:48

Re: mehrere funktionsparameter bei beginthread übergeben?
 
Es wird ein Pointer erwartet bzw. die CPU erwartet einen 32bit-Wert. Und das klappt problemlos.
Man muss halt nur als Parameter (lparam) den Objektzeiger mitgeben, denn die Methode hätte ja ganz gern genau diesen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:03 Uhr.
Seite 2 von 2     12   

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