udimapbuffer.pas
来自「楠楠写的DBiocp例子都是源码」· PAS 代码 · 共 131 行
PAS
131 行
unit uDIMapBuffer;
interface
uses
Windows, SysUtils, uCriticalSection, uDIBuffer;
type
TDIMapBuffer = Class
private
FBufferLock: TCriticalSection; //锁
m_pBufferList: TDIBuffer; //指针
m_nBufferCount: DWORD; //空闲数量
public
procedure AddDIBuffer(FBuffer: TDIBuffer); //增加DIBuffer到列表
function RemoveDIBuffer(FBuffer: TDIBuffer): Boolean; //把DIBuffer从列表中删除
procedure FreeBuffers; //释放所有DIBuffer
function GetBufferCount: Integer; //得到池内DIBuffer总数量
published
property FMapBufferLock: TCriticalSection read FBufferLock write FBufferLock;
property FBufferList: TDIBuffer read m_pBufferList write m_pBufferList;
property FBufferCount: DWORD read m_nBufferCount write m_nBufferCount;
public
constructor Create;
destructor Destroy; override;
end;
implementation
constructor TDIMapBuffer.Create;
begin
inherited Create;
m_nBufferCount := 0;
m_pBufferList := nil;
FBufferLock := TCriticalSection.Create;
end;
destructor TDIMapBuffer.Destroy;
begin
FreeBuffers;
FreeAndNil(FBufferLock);
inherited Destroy;
end;
function TDIMapBuffer.GetBufferCount: Integer;
begin
try
FBufferLock.Lock;
Result := m_nBufferCount;
finally
FBufferLock.UnLock;
end;
end;
procedure TDIMapBuffer.AddDIBuffer(FBuffer: TDIBuffer);
begin
try
FBufferLock.Lock;
if FBuffer<>nil then begin
FBuffer.m_pNext := m_pBufferList;
m_pBufferList := FBuffer;
Inc(m_nBufferCount);
end;
finally
FBufferLock.UnLock;
end;
end;
function TDIMapBuffer.RemoveDIBuffer(FBuffer: TDIBuffer): Boolean;
var
m_pBuffer: TDIBuffer;
begin
try
FBufferLock.Lock;
Result := FALSE;
if FBuffer<>nil then begin
if ( m_pBufferList = FBuffer ) then begin
m_pBufferList := m_pBufferList.m_pNext;
FBuffer.m_pNext := nil;
Dec(m_nBufferCount);
Result := TRUE;
end
else
begin
m_pBuffer := m_pBufferList;
while (m_pBuffer<> nil) and (m_pBuffer.m_pNext<>FBuffer) do
m_pBuffer := m_pBuffer.m_pNext;
if m_pBuffer<> nil then begin
m_pBuffer.m_pNext := FBuffer.m_pNext;
FBuffer.m_pNext := nil;
Dec(m_nBufferCount);
Result := TRUE;
end;
end;
end;
finally
FBufferLock.UnLock;
end;
end;
procedure TDIMapBuffer.FreeBuffers;
var
m_pFreeBuffer: TDIBuffer;
m_pNextBuffer: TDIBuffer;
begin
try
FBufferLock.Lock;
m_pFreeBuffer := m_pBufferList;
m_pNextBuffer := nil;
while (m_pFreeBuffer<> nil) do begin
m_pNextBuffer := m_pFreeBuffer.m_pNext;
FreeAndNil(m_pFreeBuffer);
Dec(m_nBufferCount);
m_pFreeBuffer := m_pNextBuffer;
end;
m_pBufferList := nil;
m_nBufferCount := 0;
finally
FBufferLock.UnLock;
end;
end;
end.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?