Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
Delphi 7 Enterprise
|
Re: mehrere funktionsparameter bei beginthread übergeben?
9. Mär 2009, 11: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.
|
|
Zitat
|