DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: melqui
今日帖子: 6
在线用户: 10
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 bamboocaep (bamboocaep) ★☆☆☆☆ -
普通会员
2015/2/27 12:14:50
标题:
Delphi泛型应用示例之二:通用数据池 浏览:1581
加入我的收藏
楼主: 精简版,不解释。

unit BambooInstenceCache;

interface

uses
  System.Generics.Collections;

type

  TInterface_BambooInstenceCache<T> = interface
    function Dequeue: T;
    function IdleCount: Integer;
    procedure ClearIdle;
    procedure Enqueue(const aInstence: T);
  end;

  TBambooInstenceCache<T> = class(TInterfacedObject, TInterface_BambooInstenceCache<T>)
  public type
    TBambooRefProc_Var = reference to procedure(var aInstence: T);
  strict private
    FIdle: TList<T>;
    FProcCreateInstence: TBambooRefProc_Var;
    FProcDestroyInstence: TBambooRefProc_Var;
  private
    function Dequeue: T;
    function IdleCount: Integer;
    procedure ClearIdle;
    procedure Enqueue(const aInstence: T);
  public
    constructor Create(const aProcCreateInstence, aProcDestroyInstence: TBambooRefProc_Var);
    destructor Destroy; override;
  end;

implementation

{ TBambooInstenceCache<T> }

procedure TBambooInstenceCache<T>.ClearIdle;
var
  aItem: T;
  i: Integer;
begin
  if Assigned(FProcDestroyInstence) then
    for i := 0 to FIdle.Count - 1 do
    begin
      aItem := FIdle.Items[i];
      FProcDestroyInstence(aItem);
    end;
  FIdle.Clear;
end;

constructor TBambooInstenceCache<T>.Create(const aProcCreateInstence, aProcDestroyInstence: TBambooRefProc_Var);
begin
  inherited Create;
  FProcCreateInstence := aProcCreateInstence;
  FProcDestroyInstence := aProcDestroyInstence;
  FIdle := TList<T>.Create;
end;

function TBambooInstenceCache<T>.Dequeue: T;
begin
  if FIdle.Count > 0 then
  begin
    Result := FIdle.Last;
    FIdle.Delete(FIdle.Count - 1);
  end
  else
  begin
    Result := Default (T);
    if Assigned(FProcCreateInstence) then
      FProcCreateInstence(Result);
  end;
end;

destructor TBambooInstenceCache<T>.Destroy;
begin
  ClearIdle;
  FIdle.DisposeOf;
  inherited Destroy;
end;

procedure TBambooInstenceCache<T>.Enqueue(const aInstence: T);
begin
  FIdle.Add(aInstence);
end;

function TBambooInstenceCache<T>.IdleCount: Integer;
begin
  Result := FIdle.Count;
end;

end.
----------------------------------------------
-
作者:
男 biznow (biznow) ★☆☆☆☆ -
盒子活跃会员
2015/2/27 14:18:42
1楼: 需要实例,谢谢~!
----------------------------------------------
-
作者:
男 bamboocaep (bamboocaep) ★☆☆☆☆ -
普通会员
2015/2/27 15:05:12
2楼: 就这么两个函数,还要什么实例?要用了就Dequeue,用完就Enqueue。
----------------------------------------------
-
作者:
男 biznow (biznow) ★☆☆☆☆ -
盒子活跃会员
2015/2/27 19:20:35
3楼: 这个我知道,关键是实例化时需要create入参,这个在什么情况下使用,怎么使用,还是希望再明白一点,谢谢
----------------------------------------------
-
作者:
男 bamboocaep (bamboocaep) ★☆☆☆☆ -
普通会员
2015/2/27 20:39:20
4楼: create的参数是两个匿名函数,一个负责初始化数据,一个负责销毁数据。数据类型T只要不是简单数据(简单数据一般也用不着做数据池),比如含有接口,类,指针,那么都需要写这两个匿名函数。
----------------------------------------------
-
作者:
男 bamboocaep (bamboocaep) ★☆☆☆☆ -
普通会员
2015/2/28 8:35:16
5楼: 假如你想实现一个4K大小的内存块池,可以这么写:
var
  FMemoryCache: TInterface_BambooInstenceCache<Pointer>;

begin
  FMemoryCache := TBambooInstenceCache<Pointer>.Create(
    procedure(var aInstence: Pointer)
    begin
      GetMem(aInstence, 4096);
    end,
    procedure(var aInstence: Pointer)
    begin
      FreeMem(aInstence);
    end);
end;
----------------------------------------------
-
作者:
男 iceair (冰晰空气) ★☆☆☆☆ -
盒子活跃会员
2015/2/28 10:58:03
6楼: 看了楼主的示例,对使用范型又进步了一点,感谢楼主。
----------------------------------------------
心无挂碍,无有恐怖,远离颠倒梦想,究竟涅槃。
作者:
男 souledge (souledge) ★☆☆☆☆ -
普通会员
2015/2/28 11:14:32
7楼: 思路不错,值得借鉴
----------------------------------------------
-
作者:
男 bamboocaep (bamboocaep) ★☆☆☆☆ -
普通会员
2015/2/28 11:36:35
8楼: 这个是精简版,大家可以自行加入多线程支持或者限制闲置数据量的代码。
----------------------------------------------
-
作者:
男 bamboocaep (bamboocaep) ★☆☆☆☆ -
普通会员
2015/2/28 11:54:31
9楼: 笔误,Instence应为Instance
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行76.17188毫秒 RSS