📄 udipoolbuffer.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 + -