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;