⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 udipoolbuffer.pas

📁 楠楠写的DBiocp例子都是源码
💻 PAS
字号:
unit uDIPoolBuffer;

interface

uses
  Windows, SysUtils, uCriticalSection, uDIBuffer, uException, uWin32Const;
  {$I IOCP.inc}
  
type

  TDIPoolBuffer = Class
  private
    FPoolBufferLock:          TCriticalSection;           //锁
    m_pFreeBufferList:        TDIBuffer;                  //指针
    m_nFreeBufferCount:       Integer;                    //空闲数量
    m_iMaxNumberOfFreeBuffer: Integer;                    //池内最大数量,超过释放
  public
    function AllocateFreeBufferFromPool: TDIBuffer;       //分配空闲DIBuffer
    procedure ReleaseBufferToPool(FDIBuffer: TDIBuffer);  //回收空闪DIBuffer
    procedure FreeBuffers;                                //释放所有DIBuffer
    function GetBufferCount: Integer;                     //得到池内DIBuffer总数量
    procedure SetMaxFreeBuffer(m_MaxNumber: Integer);     //设置池内最大允许数量
  published
    property FMaxNumberOfFreeBuffer: Integer read m_iMaxNumberOfFreeBuffer write SetMaxFreeBuffer;
  public
    constructor Create;
    destructor Destroy; override;
  end;

implementation
  uses uDIMonitor;


constructor TDIPoolBuffer.Create;
begin
  inherited Create;
  m_nFreeBufferCount := 0;
  m_iMaxNumberOfFreeBuffer := 10;
  m_pFreeBufferList := nil;
  FPoolBufferLock := TCriticalSection.Create;
end;

destructor TDIPoolBuffer.Destroy;
begin
  FreeBuffers;
  FreeAndNil(FPoolBufferLock);
  inherited Destroy;
end;

function TDIPoolBuffer.GetBufferCount: Integer;
begin
  try
    FPoolBufferLock.Lock;
    Result := m_nFreeBufferCount;
  finally
    FPoolBufferLock.UnLock;
  end;
end;

procedure TDIPoolBuffer.SetMaxFreeBuffer(m_MaxNumber: Integer);
begin
  try
    FPoolBufferLock.Lock;
    if m_MaxNumber>=0 then m_iMaxNumberOfFreeBuffer := m_MaxNumber;
  finally
    FPoolBufferLock.UnLock;
  end;
end;

function TDIPoolBuffer.AllocateFreeBufferFromPool: TDIBuffer;
var
  m_pDIBuffer: TDIBuffer;
begin
  try
    FPoolBufferLock.Lock;

    m_pDIBuffer := nil;
    if ( m_pFreeBufferList = nil ) then begin
      m_pDIBuffer := TDIBuffer.Create;

      //性能分析器 增加Buffer New数量
      {$IFDEF _IOCP_MONITOR}
          _DIMonitor.AddNewBuffer;
      {$ENDIF}
    end
    else
    begin
      m_pDIBuffer := m_pFreeBufferList;
      m_pFreeBufferList := m_pFreeBufferList.m_pNext;
      Dec(m_nFreeBufferCount);
    end;
  finally
    FPoolBufferLock.UnLock;
  end;

  if m_pDIBuffer<> nil then m_pDIBuffer.InitBuffer;
  Result := m_pDIBuffer;
end;

procedure TDIPoolBuffer.ReleaseBufferToPool(FDIBuffer: TDIBuffer);
begin
  try
    FPoolBufferLock.Lock;

    if ( m_nFreeBufferCount < m_iMaxNumberOfFreeBuffer) then begin
      FDIBuffer.m_pNext := m_pFreeBufferList;
      m_pFreeBufferList := FDIBuffer;
      Inc(m_nFreeBufferCount);
    end
    else
    begin
      FreeAndNil(FDIBuffer);
      FDIBuffer := nil;

      //性能分析器 增加Buffer Free数量
      {$IFDEF _IOCP_MONITOR}
          _DIMonitor.AddFreeBuffer;
      {$ENDIF}
    end;
  finally
    FPoolBufferLock.UnLock;
  end;
end;

procedure TDIPoolBuffer.FreeBuffers;
var
  m_pDIFreeBuffer: TDIBuffer;
  m_pDINextBuffer: TDIBuffer;
begin
  try
    FPoolBufferLock.Lock;

    m_pDIFreeBuffer := m_pFreeBufferList;
    m_pDINextBuffer := nil;
    while (m_pDIFreeBuffer<> nil) do begin
      m_pDINextBuffer := m_pDIFreeBuffer.m_pNext;
      FreeAndNil(m_pDIFreeBuffer);
      Dec(m_nFreeBufferCount);
      m_pDIFreeBuffer := m_pDINextBuffer;
    end;
    m_pFreeBufferList := nil;
    m_nFreeBufferCount := 0;
  finally
    FPoolBufferLock.UnLock;
  end;
end;

end.


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -