打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Delphi泛型应用示例之二:通用数据池
楼主: 精简版,不解释。
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) ▲▲▲▲▲ -
盒子活跃会员
2015-2-27 14:18:42
1楼: 需要实例,谢谢~!
----------------------------------------------
-
作者:
(bamboocaep) ▲▲▲▲△ -
注册会员
2015-2-27 15:05:12
2楼: 就这么两个函数,还要什么实例?要用了就Dequeue,用完就Enqueue。
----------------------------------------------
-
作者:
(biznow) ▲▲▲▲▲ -
盒子活跃会员
2015-2-27 19:20:35
3楼: 这个我知道,关键是实例化时需要create入参,这个在什么情况下使用,怎么使用,还是希望再明白一点,谢谢
----------------------------------------------
-
作者:
(bamboocaep) ▲▲▲▲△ -
注册会员
2015-2-27 20:39:20
4楼: create的参数是两个匿名函数,一个负责初始化数据,一个负责销毁数据。数据类型T只要不是简单数据(简单数据一般也用不着做数据池),比如含有接口,类,指针,那么都需要写这两个匿名函数。
----------------------------------------------
-
作者:
(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;
----------------------------------------------
-
作者:
(冰晰空气) ▲▲▲▲▲ -
盒子活跃会员
2015-2-28 10:58:03
6楼: 看了楼主的示例,对使用范型又进步了一点,感谢楼主。
----------------------------------------------
心无挂碍,无有恐怖,远离颠倒梦想,究竟涅槃。
作者:
(souledge) ▲▲▲▲▲ -
普通会员
2015-2-28 11:14:32
7楼: 思路不错,值得借鉴
----------------------------------------------
-
作者:
(bamboocaep) ▲▲▲▲△ -
注册会员
2015-2-28 11:36:35
8楼: 这个是精简版,大家可以自行加入多线程支持或者限制闲置数据量的代码。
----------------------------------------------
-
作者:
(bamboocaep) ▲▲▲▲△ -
注册会员
2015-2-28 11:54:31
9楼: 笔误,Instence应为Instance
----------------------------------------------
-
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Delphi WebBrowser始终在当前窗口打开新网页
delphi 限制FORM窗体为固定的大小
delphi WebBrowser 去边框
Delphi的图形处理(一)
delphi多线程编程
Delphi自动检测U盘插入
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服