Entwickler-Ecke
Windows API - Problem mit Threaderstellung
Mouri - Mi 13.08.08 15:35
Titel: Problem mit Threaderstellung
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:
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: 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
Delete - Mi 13.08.08 21:45
Also etwas Code Formatierung würdee nicht schaden. Und natürlcih bleibt das Programm stehen, du wartest ja mit WaitForSingleObject darauf das der Thread in den sgnalisierten Zustand übergeht.
Mouri - Mi 13.08.08 23:00
Das (eine?) Problem liegt wohl hier:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| if (SR.Name <> '.') and (SR.Name <> '..') then begin --->>> FindAllFolders2(RootFolder + SR.Name, Mask, Recurse); Form1.ListBox2.Items.Add(RootFolder); end; until FindNext(SR) <> 0; |
Doch wie bekomme ich es hin SR.NAME unterzubringen:
Delphi-Quelltext
1:
| FindAllFolders2(ff+ SR.Name); |
geht ja nicht, genausowenig wie:
Delphi-Quelltext
1:
| FindAllFolders2(PThreadParams(ff)^.RootFolder+SR.NAME, ...) |
Hat jemand vielleicht eine Idee ?
Ich wollte das ganze in einen Thread packen weil mir die Hauptanwendung einfriert, nicht bei FindAllFolders, sondern bei FindAllFiles. FindAllFolders habe ich nur gewählt um mich erstmal am einfacheren (so langsam relativiert sich das ) Code entlangzuhangeln.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!