Einzelnen Beitrag anzeigen

Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#12

Re: mehrere funktionsparameter bei beginthread übergeben?

  Alt 9. Mär 2009, 10:36
Zitat von Luckie:
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;
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat