首页 > 其他分享 >对象池泛型模板

对象池泛型模板

时间:2024-09-02 12:48:52浏览次数:7  
标签:begin TPool end 对象 list Value FList 池泛 模板

对象池泛型模板

delphi和lazarus都适用。泛型配合继承,无敌的存在。

//cxg 2024-9-2
//对象池的泛型模板
unit sys.pool;
{$i def.inc}

interface

uses
  //system--------
  Generics.Collections, Classes, SysUtils;

type
  TPool<T> = class
  private
    //连接池的空闲连接
    FList: TthreadList<T>;
    //池大小
    FPoolSize: Integer;  f: tclass;
  public
    constructor Create(poolSize: Integer); virtual;
    destructor Destroy; override;
  private
    //初始化
    procedure Init;
  protected
    //新建一个对象
    function NewObj: T; virtual; abstract;
  public
    //从池中取一个对象
    function Lock: T; virtual;
    //归还池中
    procedure Unlock(Value: T); virtual;
  end;

implementation

constructor TPool<T>.Create(poolSize: Integer);
begin
  FList := TThreadList<T>.Create;
  Self.FPoolSize := poolSize;    //根据实际情况,合理设置
  self.Init;
end;

destructor TPool<T>.Destroy;
begin
  FList.Clear;
  FreeAndNil(FList);
  inherited Destroy;
end;

procedure TPool<T>.Init;
var
  list: TList<T>;
begin
  list := FList.LockList;
  try
    while list.Count < Self.FPoolSize do
      List.Add(NewObj);
  finally
    FList.UnlockList;
  end;
end;

function TPool<T>.Lock: T;
var
  list: TList<T>;
begin
  list := FList.LockList;
  try
    if list.Count > 0 then
    begin
      Result := list.Last;
      List.Remove(Result);
    end
    else
    begin //池中已无可用对象,池容量+1
      List.Add(NewObj);
      Result := list.Last;
      List.Remove(Result);
    end;
  finally
    FList.UnlockList;
  end;
end;

procedure TPool<T>.Unlock(Value: T);
begin
  FList.Add(Value);
end;

end.

具体的对象池

//cxg 2024-9-2
//mormot2 THttpClientSocket-pool
unit mormot2.httpclientpool;
{$i def.inc}

interface

uses
  //system-----
  SysUtils,
  //mormot----------
  mormot.net.client,
  //my---------
  sys.pool;

type
  ThttpclientPool = class(TPool<THttpClientSocket>)
  public
    constructor Create(poolSize: Integer); override;
    function NewObj: THttpClientSocket; override;
    procedure unlock(Value: THttpClientSocket); override;
  end;

implementation

uses proxy.global;

constructor ThttpclientPool.Create(poolSize: Integer);
begin
  inherited;
  writeln('New THttpClientSocket-pool, poolSize: ' + poolSize.ToString);
end;

function ThttpclientPool.NewObj: THttpClientSocket;
begin
  Result := THttpClientSocket.Create;
end;

procedure ThttpclientPool.Unlock(Value: THttpClientSocket);
begin
  Value.close;
  Value.CloseSockIn;
  Value.CloseSockOut;
  inherited;
end;

end.

 

标签:begin,TPool,end,对象,list,Value,FList,池泛,模板
From: https://www.cnblogs.com/hnxxcxg/p/18392490

相关文章

  • 将新对象添加到特定现有数组名称内,并使用索引值进行保存
    你可以使用JavaScript的数组方法来实现这个功能。以下是一个示例代码:letarray=[{id:1,name:'John'},{id:2,name:'Jane'},{id:3,name:'Jack'}];letnewObject={id:4,name:'Jill'};array[array.length]=newObject;c......
  • 15、java 面向对象之二:对象的创建和使用(对象内存解析和匿名对象)、再谈方法(方法的重
    java面向对象之二:Ⅰ、对象的创建和使用:1、对象的内存解析:其一、描述:其二、内存解析代码1为:其三、内存解析截图1为:其四、内存解析代码2为:其五、内存解析截图2为:2、匿名对象的使用:其一、描述:其二、代码为:其三、截图为:3、自定义数组的工具类:其一、描述:其二、代码为:A、Arr......
  • Ceph Reef(18.2.X)之对象访问策略配置
    作者:尹正杰版权声明:原创作品,谢绝转载!否则将追究法律责任。目录一.对象存储概述1.对象存储的访问方式2.基于http方式访问对象存储注意事项3.查看存储桶默认策略二.定制策略1.定制......
  • 章10——面向对象编程(高级部分)——类名类方法
    类变量/静态(static)变量/静态属性特点:由该类的全体对象实例共享,该变量只占同一块内存空间。其标志是关键字static修饰。在类加载的时候便生成了。类加载的时机如下图:publicstaticintcount=0;类变量可以由类名来访问。System.out.println("共有"+Child.count+"......
  • 模板2
    字符串KMPnxt[i]:$b[1:i]$的最长border$b[1:nxt_i]$,且$nxt_i<i$。voidinit(){intp=0;F(i,2,m){while(p&&b[p+1]!=b[i])p=nxt[p];//p+1尝试与i匹配if(b[p+1]==b[i])p++;nxt[i]=p;}}voidkmp(){intp=0;F(i,1,n){......
  • 六大排序(算法详解+模板+例题)
    一.排序算法是什么排序算法(SortingAlgorithms)是一种数据结构操作,它的目的是将一串元素按照特定的顺序规则组织起来。常见的排序算法有升序(从小到大)和降序(从大到小)排列,如冒泡排序、希尔排序、插入排序、选择排序、快速排序、归并排序等。排序的主要目的是为了方便查找、分析数......
  • 白骑士的CSS高级篇之CSS Grid布局进阶 4.1.2 网格模板与区域
            CSSGrid布局是CSS中强大的布局系统之一,它提供了更灵活和更高效的方式来创建复杂的网页布局。通过Grid布局,你可以将网页划分为多个网格区域,并在这些区域中放置内容,这使得布局更加直观和易于维护。本文将深入探讨Grid布局中的网格模板和区域的概念,帮助你掌握如......
  • 用Python解决预测问题_对数线性模型模板
    对数线性模型(Log-linearmodel)是统计学中用于分析计数数据或频率数据的一类模型,特别是在多维列联表(contingencytables)分析中非常常见。这种模型通过取对数将乘法关系转换为加法关系,从而简化了数据分析。在对数线性模型中,我们通常对观测频数的对数进行建模,模型的形式可以表示......
  • C++面向对象编程(OOP)教程
    C++面向对象编程(OOP)教程在C++中,面向对象编程(OOP)是一种编程范式,它基于“对象”的概念来设计软件。OOP强调将数据(属性)和操作这些数据的方法(行为)封装在一起,形成对象。这种封装提高了代码的模块化、可重用性和可维护性。C++通过类(Class)、对象(Object)、继承(Inheritance)、封装(Encapsu......
  • Windows Server 2019 OVF, updated Aug 2024 (sysin) - VMware 虚拟机模板
    WindowsServer2019OVF,updatedAug2024(sysin)-VMware虚拟机模板2024年8月版本更新,现在自动运行sysprep,支持ESXiHostClient部署请访问原文链接:https://sysin.org/blog/windows-server-2019-ovf/,查看最新版。原创作品,转载请保留出处。现在都是自动sysprep的......