Autor Beitrag
Mouri
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mi 13.08.08 15:35 
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:
ausblenden 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:

ausblenden volle Höhe 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:



ausblenden 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);
      // WaitForSingleObject(Thread, INFINITE);
       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 user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Mi 13.08.2008 um 15:37


Zuletzt bearbeitet von Mouri am Do 14.08.08 00:13, insgesamt 4-mal bearbeitet
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mi 13.08.08 23:00 
Das (eine?) Problem liegt wohl hier:
ausblenden 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:
ausblenden Delphi-Quelltext
1:
 FindAllFolders2(ff+ SR.Name);					

geht ja nicht, genausowenig wie:
ausblenden 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.