Thema: Delphi Findclose im Thread

Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.056 Beiträge
 
Delphi 12 Athens
 
#2

AW: Findclose im Thread

  Alt 5. Apr 2017, 17:01
Sicher, dass die Threads durchlaufen und nicht abstürzen?
Delphi fängt Exceptions in TThreads ab (da Windows sonst das ganze Programm hart abschießt), allerdings werden Exceptions im Thread nicht angezeigt, so wie es z.B. die VCL tut.

Entweder per Try-Except im Thread.Execute
oder im Thread.OnTerminate das (Thread.FatalException as Exception) prüfen und anzeigen/loggen.




Gut, abgesehn von fehlenden Ressourcen-Schutzblöcken (Try Finally) fällt auf die Schnelle nichts Schlimmes auf.

Da das in den Unterverzeichnisse nicht auftritt, würde ich einen Fehler in TThreadSearchDocuments.FindFileInPath eher ausschließen,
denn wenn da der Fehler wäre, dann doch in allen Ebenen? Die Funktion ist ja in sich geschlossen und ruft sich selber rekursiv aufruft.

Tipps:
Delphi-Quellcode:
if (Pos(lowercase(FName),lowercase(filename))>0)

if StartsText(FName, filename)
Und ein Verziechnis mit weiteren Attributen ist für dich kein Verzeichnis? (Bit-Maske)
Delphi-Quellcode:
if (sr.Attr = faDirectory)

if (sr.Attr and faDirectory <> 0)


Warum ist da eigentlich mehrfach fast der selbe Code drin (pro TrTyp) und das ganze auch noch doppelt (FAddDirectories) ?

Delphi-Quellcode:
procedure TThreadSearchDocuments.FindFileInPath(Path: string);
var
  sr: TSearchRec;
  filename: string;
begin
  if Self.Terminated then
    Exit;
  if FindFirst(path+'*.*', faAnyFile, sr)=0 then
    try
      repeat
        if (sr.Name='.') or (sr.Name='..') then
          Continue;
        Inc(TCount);
        DoOnDokumentCount(TCount);
        filename:=StringReplace(sr.Name, ' ', '', [rfReplaceAll]);
        if (sr.Attr and faDirectory = 0) or FAddDirectories then begin
          if .... (FName<>'') .. and StartsText(FName, .. filename) then TrTyp:='Name'
          else if (FKZ<>'') .... and StartsText(FKZ, .... filename) then TrTyp:='KZ'
          else if (FVIN<>'') ... and StartsText(FVIN, ... filename) then TrTyp:='VIN'
          else if (FDebitor<>'') and StartsText(FDebitor, filename) then TrTyp:='KdNr'
          else TrTyp:='';
          if TrTyp<>'then begin
            TrName:=ExtractFileName(sr.Name); // steht hier nicht eh nur der Filename drin?
            TrPath:=Path;
            TrDatum:=FileTimeToDateTime(sr.FindData.ftLastWriteTime);
            TrGroesse:=sr.Size;
            DoOnFoundDokument(TrName, TrTyp, TrPath, TrDatum, TrGroesse);
          end;
        end;
        if FAddDirectories then
          FindFileInPath(path+sr.Name+'\');
      until Self.Terminated or (FindNext(sr)<>0);
    finally
      FindClose(sr);
    end;
end;
Ist nicht ganz eindeutig, das rumge-pos-se ... Wirklich Delphi-Referenz durchsuchenStartsText oder doch eher Delphi-Referenz durchsuchenSameText?
Für SameText, oder eher MatchText, da ja Mehreres:
Delphi-Quellcode:
//const cTrTyp: array[0..3] of string = ('Name', 'KZ', 'VIN', 'KdNr');
if (sr.Attr and faDirectory = 0) or FAddDirectories then begin
  if MatchText(filename, [FName, FKZ, FVIN, FDebitor]) then begin
    TrName:=ExtractFileName(sr.Name); // steht hier nicht eh nur der Filename drin?
    {case IndexText(filename, [FName, FKZ, FVIN, FDebitor]) of
      0: TrTyp:='Name';
      1: TrTyp:='KZ';
      2: TrTyp:='VIN';
      3: TrTyp:='KdNr';
      else TrTyp:='';  // im ELSE oder vor dem REPEAT initialisiert, damit der Compiler nicht meckert
    end;}

    TrTyp:=cTrTyp[IndexText(filename, [FName, FKZ, FVIN, FDebitor])];
    TrPath:=Path;
    TrDatum:=FileTimeToDateTime(sr.FindData.ftLastWriteTime);
    TrGroesse:=sr.Size;
    DoOnFoundDokument(TrName, TrTyp, TrPath, TrDatum, TrGroesse);
  end;
end;
StartsStr StartsText SameStr SameText MatchStr MatchText ... siehe Delphi-Referenz durchsuchenStrUtils



Testhalber mal ein Exit; an den Anfang von TThreadSearchDocuments.FindFileInPath und schauen, ob die Verzeichnisse immernoch offen sind.
Dann ist es definitiv wo anders.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 5. Apr 2017 um 17:19 Uhr)
  Mit Zitat antworten Zitat