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 + -
显示快捷键?