anchor.diff:  var
     i: integer;
     lFile: TMonitoredFile;
  +  lst: TList;
   begin
     while not Terminated do
     begin
       if Assigned(FOnFileChanged) then
       begin
  -      for i := FFileList.Count-1 downto 0 do
  -      begin
  -        lFile := TMonitoredFile(FFileList[i]);
  -        if fpgFileExists(lFile.Name) then
  +      lst := FFileList.LockList;
  +      try
  +        for i := lst.Count-1 downto 0 do
           begin
  -          if lFile.SHA1 <> lFile.GetNewSHA1 then
  +          lFile := TMonitoredFile(lst[i]);
  +          if fpgFileExists(lFile.Name) then
  +          begin
  +            if lFile.SHA1 <> lFile.GetNewSHA1 then
  +            begin
  +              FCurrent := lFile;
  +              FCurrentState := fmeFileChanged;
  +              Synchronize(@DoFileChangeNotification);
  +              lFile.UpdateInfo;
  +            end;
  +          end
  +          else
             begin
               FCurrent := lFile;
  -            FCurrentState := fmeFileChanged;
  +            FCurrentState := fmeFileDeleted;
               Synchronize(@DoFileChangeNotification);
  -            lFile.UpdateInfo;
  +            lst.Remove(lFile);
             end;
  -        end
  -        else
  -        begin
  -          FCurrent := lFile;
  -          FCurrentState := fmeFileDeleted;
  -          Synchronize(@DoFileChangeNotification);
  -          FFileList.Remove(lFile);
           end;
  +      finally
  +        FFileList.UnlockList;
         end;
       end;
       sleep(FInterval);
  
positive.code: constructor TFileMonitor.CreateCustom;
  begin
    Create(True);
    FFileList := TObjectList.create(True);
    FInterval := 500;
  end;
  
  destructor TFileMonitor.Destroy;
  begin
    FFileList.Free;
    inherited Destroy;
  end;
  
negative.code:   TFileMonitor = class(TThread)
    private
      FInterval: LongWord;
      FFileList: TThreadList;
      FOnFileChanged: TFileChangedEvent;
      FCurrent: TMonitoredFile;
      FCurrentState: TFileMonitorEventType;
  