Hallo erstmal Delphi Forum.
Ich hoffe das mein erster Post nicht gleich im falschen Unterforum gelandet ist.
Im Moment versuche ich mich auf dem Feld der Threads und habe ein Problem mit dem ich nicht weiterkomme:
Folgende Prozedur würde ich gerne als Thread benutzen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure FindAllFolders(RootFolder: string; Mask: string = '*.*'; Recurse: Boolean = True); var SR: TSearchRec; begin if AnsiLastChar(RootFolder)^ <> '\' then RootFolder := RootFolder + '\'; if Recurse then if FindFirst(RootFolder + '*.*', faAnyFile, SR) = 0 then begin try repeat if SR.Attr and faDirectory = faDirectory then if (SR.Name <> '.') and (SR.Name <> '..') then begin FindAllFolders(RootFolder + SR.Name, Mask, Recurse); Form1.ListBox2.Items.Add(RootFolder); end; until FindNext(SR) <> 0; finally FindClose(SR); end; end; end; |
Dafür habe ich die Prozedur nach bestem Wissen und Gewissen umgemodelt:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42:
| type TThreadParams = packed record RootFolder:string; Mask:string; Recurse:Boolean; end; PThreadParams =^TThreadParams;
procedure FindAllFolders2(ff:PThreadParams); var RootFolder: string; Mask: string; Recurse:Boolean; SR: TSearchRec;
begin RootFolder:=PThreadParams(ff)^.RootFolder; Mask:=PThreadParams(ff)^.Mask; Recurse:=PThreadParams(ff)^.Recurse; begin begin if AnsiLastChar(RootFolder)^ <> '\' then RootFolder := RootFolder + '\'; if Recurse then if FindFirst(RootFolder + '*.*', faAnyFile, SR) = 0 then begin try repeat if SR.Attr and faDirectory = faDirectory then if (SR.Name <> '.') and (SR.Name <> '..') then begin FindAllFolders2(RootFolder + SR.Name, Mask, Recurse); Form1.ListBox2.Items.Add(RootFolder); end; until FindNext(SR) <> 0; finally FindClose(SR); end; end; end; end; |
Und rufe sie wie folgt auf:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| procedure RunFindAllFolders2; var ff:TThreadParams; Thread:THandle; ThreadID:Cardinal; ExitCode:Cardinal; SR:TSearchRec; begin begin ff.Mask:='*.*'; ff.RootFolder:='D:\'; ff.Recurse:=True; Thread:=BeginThread(nil,0,@FindAllFolders2,@ff,0,ThreadID); GetExitCodeThread(Thread,ExitCode); end; CloseHandle(Thread); end;
procedure TForm1.Button2Click(Sender: TObject); begin RunFindAllFolders2; end; |
Ich hoffe das ich mich nicht vollends damit blamiere, denn Fehler sind drin sonst würde das Programm nicht stehenbleiben
Es gibt mir aber keine Fehler aus :/
Moderiert von
Narses: Topic aus Sonstiges (Delphi) verschoben am Mi 13.08.2008 um 15:37