procedure TCustomCache.RefreshCache;
var
     i:Integer;
     CurItem:TCustomCacheItem;
     UpdateAge,AccessAge:Integer;
     NeedRefresh:Boolean;
     CurTime:_SYSTEMTIME;
begin
     if not FRefreshEnable then Exit;
     GetLocalTime(CurTime);
     if ((CurTime.wHour < FRefreshFrom) or (CurTime.wHour >= FRefreshTo)) then Exit;
     FRefreshThreadCounter:=FRefreshThreadCounter + 1;
     i:=1;
     while (i <= FItemsCount) do begin
          CurItem:=GetItem(i);
          CurItem.RegisterHeadReading;
          NeedRefresh:=CurItem.FData.FUsed;
          if NeedRefresh then begin
               UpdateAge:=CurItem.GetUpdateAge;
               AccessAge:=CurItem.GetAccessAge;
               NeedRefresh:=((AccessAge <= UpdateAge) and (UpdateAge > CurItem.FData.FRefreshRate));
          end;
          CurItem.UnregisterHeadReading;
          if NeedRefresh then begin
               GetLocalTime(CurTime);
               if ((CurTime.wHour < FRefreshFrom) or (CurTime.wHour >= FRefreshTo)) then Break;
               RefreshItem(CurItem);
          end;
          i:=i + 1;
     end;
end;



function TCustomCache.FindPage(const PageCrc:DWORD; const SliceItem:TSliceItem):Boolean;
var
     i:Integer;
     CurItem:TCustomCacheItem;
     NeedRefresh:Boolean;
begin
     Result:=False;
     i:=1;
     while ((not Result) and (i <= FRealMaxItem)) do begin
          CurItem:=GetItem(i);
          NeedRefresh:=False;
          CurItem.RegisterHeadReading;
          if (CurItem.FData.FUsed and (CurItem.FData.FCrc = PageCrc)) then begin
               NeedRefresh:=FRefreshEnable and FForcedEnable;
               if NeedRefresh then NeedRefresh:=(CurItem.GetUpdateAge > CurItem.FData.FRefreshRate);
               Result:=True;
          end;
          CurItem.UnregisterHeadReading;
          if Result then begin
               if NeedRefresh then RefreshItem(CurItem);
               CurItem.RegisterBodyReading;
               CurItem.BodyToSlice(SliceItem);
               CurItem.UnregisterBodyReading;
               CurItem.BeginHeadWriting;
               GetLocalTime(CurItem.FData.FAccessTime);
               CurItem.FData.FCounter:=CurItem.FData.FCounter + 1;
               CurItem.EndHeadWriting;
          end;
          i:=i + 1;
     end;
end;