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

📄 udimonitor.pas

📁 楠楠写的DBiocp例子都是源码
💻 PAS
📖 第 1 页 / 共 2 页
字号:
unit uDIMonitor;

interface

uses
  Windows, SysUtils, StrUtils, DateUtils, uCriticalSection;

type

  TDIMonitor = Class
  private
    m_bStart:           Boolean;                //是否开始监视
    m_nTotalRecvBytes:  LongWord;               //总接受字节
    m_nTotalSendBytes:  LongWord;               //总发送字节
    m_nTotalRecvKB:     LongWord;               //总接受KB
    m_nTotalSendKB:     LongWord;               //总发送KB
    m_nTotalRecvMB:     LongWord;               //总接受MB
    m_nTotalSendMB:     LongWord;               //总发送MB
    m_nTotalRecvGB:     LongWord;               //总接受GB
    m_nTotalSendGB:     LongWord;               //总接受GB
    m_nTotalRecvTB:     LongWord;               //总接受TB
    m_nTotalSendTB:     LongWord;               //总接受TB

    m_nSecondRun:       LongWord;               //运行秒
    m_nMinuteRun:       LongWord;               //运行分
    m_nHourRun:         LongWord;               //运行时
    m_nDayRun:          LongWord;               //运行天

    m_StartRun:         DWORD;                  //起始时间 (上一次)
    m_LastRun:          DWORD;                  //终止时间 (最后一次)

    m_SendRate:         Real;                   //发送每秒字节流量
    m_RecvRate:         Real;                   //接受每秒字节流量

    m_RecvCount:        DWORD;                  //Recv投递数
    m_SendCount:        DWORD;                  //Send投递数
    m_iocpRecvCount:    DWORD;                  //IOCP队列中Recv数
    m_iocpSendCount:    DWORD;                  //IOCP队列中Send数
    m_iocpCloseSockeCount:DWORD;                //IOCP队列中ClostSocket数
    m_AcceptExBufCount: DWORD;                  //AcceptEx数量

    m_iNewBufferCount:  DWORD;                  //申请Buffer次数
    m_iFreeBufferCount: DWORD;                  //释放Buffer次数

    m_iNewClientCount:  DWORD;                  //申请上下文次数
    m_iFreeClientCount: DWORD;                  //释放上下文次数

    m_iPostCloseCounrt: DWORD;                  //投递PostClose次数
    m_iExitFreeContextCount: DWORD;             //服务器释放上下文次数

    m_ActiveConnections:DWORD;                  //系统连接数
    m_FreeContextCount: DWORD;                  //上下文池中数
    m_FreeBufCount:     DWORD;                  //内存池中Buffer数量
    m_LogCount:         DWORD;                  //日志次数

    m_MonitorLock:      TCriticalSection;
  public
    procedure ClearMonitor;                     //清空
    procedure StartMonitor;                     //开始
    procedure StopMonitor;                      //停止
    procedure CalcCapability;                   //计算性能

    //每次增加,接受,发送字节时,同时增加次数
    procedure AddRecvByte(nRecvByte: DWORD);    //增加接受字节数
    procedure AddSendByte(nSendByte: DWORD);    //增加发送字节数

    procedure AddIOCPRecv;                      //IOCP挂起数加1 (Recv)
    procedure SubIOCPRecv;                      //IOCP挂起数减1 (Recv)

    procedure AddIOCPSend;                      //IOCP挂起数加1 (Send)
    procedure SubIOCPSend;                      //IOCP挂起数加1 (Send)

    procedure AddIOCPCloseSocke;                //IOCP挂起数加1 (CloseSocke)
    procedure SubIOCPCloseSocke;                //IOCP挂起数加1 (CloseSocke)

    procedure AddIOCPAcceptEx;                  //IOCP AcceptEx挂起数加1
    procedure SubIOCPAcceptEx;                  //IOCP AcceptEx挂起数加1


    procedure AddNewBuffer;                     //IOCP 真正分配Buffer次数
    procedure AddFreeBuffer;                    //IOCP 真正释放Buffer次数

    procedure AddNewContext;                    //IOCP 真正分配上下文次数
    procedure AddFreeContext;                   //IOCP 真正释放上下文次数

    procedure AddExitFreeContextCount;          //IOCP 器释放上下文次数
    function GetExitFreeContextCount: DWORD;    //IOCP 器释放上下文次数

    procedure AddPostClose;                     //投递PostClose次数
    function GetPostClose: DWORD;               //投递PostClose次数
    procedure AddLogCount;                      //增加日志次数

    procedure AddActiveConn;                    //IOCP 系统连接数加1
    procedure SubActiveConn;                    //IOCP 系统连接数减1

    procedure GetParams( var nDay: Integer;
                         var nHour: Integer;
                         var nMinute: Integer;
                         var nSecond: Integer;

                         var nRecvGB: Integer;
                         var nRecvMB: Integer;
                         var nRecvKB: Integer;
                         var nRecvByte: Integer;

                         var nSecvGB: Integer;
                         var nSecvMB: Integer;
                         var nSecvKB: Integer;
                         var nSecvByte: Integer;

                         var rRecvRate: Real;
                         var rSendRate: Real;

                         var nNewBufferCount: Integer;
                         var nFreeBufferCount: Integer;
                         var nNewClientCount: Integer;
                         var nFreeClientCount: Integer;
                         var nExitFreeContextCount: Integer;
                         
                         var nRecvCount: Integer;
                         var nSendCount: Integer;
                         var nIocpRecvCount: Integer;
                         var nIocpSendCount: Integer;
                         var nAcceptExBufCount: Integer;
                         var nIocpBufCount: Integer;
                         var nContextCount: Integer;
                         var nFreeContextCount: Integer );
  public
    constructor Create;
    destructor Destroy; override;
  end;

  var
    _DIMonitor: TDIMonitor;

implementation

constructor TDIMonitor.Create;
begin
  inherited Create;
  m_MonitorLock := TCriticalSection.Create;
  ClearMonitor;
end;

destructor TDIMonitor.Destroy;
begin
  FreeAndNil(m_MonitorLock);
  inherited Destroy;
end;

procedure TDIMonitor.ClearMonitor;
begin
  try
    m_MonitorLock.Lock;

    m_nTotalRecvBytes := 0;
    m_nTotalSendBytes := 0;
    m_nTotalRecvKB := 0;
    m_nTotalSendKB := 0;
    m_nTotalRecvMB := 0;
    m_nTotalSendMB := 0;
    m_nTotalRecvGB := 0;
    m_nTotalSendGB := 0;

    m_nSecondRun := 0;
    m_nMinuteRun := 0;
    m_nHourRun := 0;
    m_nDayRun := 0;

    m_RecvCount := 0;
    m_SendCount := 0;
    m_iocpRecvCount := 0;
    m_iocpSendCount := 0;
    m_iocpCloseSockeCount := 0;

    m_iNewBufferCount := 0;
    m_iFreeBufferCount := 0;
    m_iNewClientCount := 0;
    m_iFreeClientCount := 0;
    m_iExitFreeContextCount := 0;
    m_iPostCloseCounrt := 0;

    m_ActiveConnections := 0;
    m_FreeContextCount := 0;
    m_FreeBufCount := 0;
    m_AcceptExBufCount := 0;
    m_LogCount := 0;

    m_StartRun := 0;
    m_LastRun := 0;
  finally
    m_MonitorLock.UnLock;
  end;
end;

procedure TDIMonitor.StartMonitor;
begin
  if not m_bStart then begin
    ClearMonitor;
    m_bStart := TRUE;
    m_StartRun := GetTickCount;
  end;
end;

procedure TDIMonitor.StopMonitor;
begin
  if m_bStart then begin
    ClearMonitor;
    m_bStart := FALSE;
  end;
end;

procedure TDIMonitor.CalcCapability;
var
  m_CountSec: Integer;
  m_RecvByte: Real;
  m_SendByte: Real;
begin
  m_LastRun := GetTickCount;

  //得到秒
  m_nSecondRun := m_nSecondRun + (m_LastRun - m_StartRun) div 1000;
  //修改起始时间   (最后时间-余数)
  m_StartRun := m_LastRun - (m_LastRun - m_StartRun) mod 1000;
  
  //秒转成分
  m_nMinuteRun := m_nMinuteRun + m_nSecondRun div 60;
  m_nSecondRun :=  m_nSecondRun mod 60;

  //分转成时
  m_nHourRun := m_nHourRun + m_nMinuteRun div 60;
  m_nMinuteRun :=  m_nMinuteRun mod 60;

  //时转换成天
  m_nDayRun := m_nDayRun + m_nHourRun div 24;
  m_nHourRun := m_nHourRun mod 24;

  //字节转化成KB
  m_nTotalRecvKB := m_nTotalRecvKB + m_nTotalRecvBytes div 1024;
  m_nTotalSendKB := m_nTotalSendKB + m_nTotalSendBytes div 1024;

  m_nTotalRecvBytes := m_nTotalRecvBytes mod 1024;
  m_nTotalSendBytes := m_nTotalSendBytes mod 1024;

  //KB转化成MB
  m_nTotalRecvMB := m_nTotalRecvMB + m_nTotalRecvKB div 1024;
  m_nTotalSendMB := m_nTotalSendMB + m_nTotalSendKB div 1024;

  m_nTotalRecvKB := m_nTotalRecvKB mod 1024;
  m_nTotalSendKB := m_nTotalSendKB mod 1024;

  //MB转化成GB
  m_nTotalRecvGB := m_nTotalRecvGB + m_nTotalRecvMB div 1024;
  m_nTotalSendGB := m_nTotalSendGB + m_nTotalSendMB div 1024;

  m_nTotalRecvMB := m_nTotalRecvMB mod 1024;
  m_nTotalSendMB := m_nTotalSendMB mod 1024;

  //计算RECV流量 秒
  m_CountSec := m_nDayRun * 24*60*60+   //天
                m_nHourRun * 60*60+     //时
                m_nMinuteRun*60+        //分
                m_nSecondRun;           //秒

  m_RecvByte := m_nTotalRecvGB*1024*1024*1024 +
                m_nTotalRecvMB*1024*1024+
                m_nTotalRecvKB*1024+
                m_nTotalRecvBytes;
  //每秒字节流量
  if m_CountSec<>0 then
    m_RecvRate := m_RecvByte/m_CountSec
  else
    m_RecvRate := 0;

  m_SendByte := m_nTotalSendGB*1024*1024*1024 +
                m_nTotalSendMB*1024*1024+
                m_nTotalSendKB*1024+
                m_nTotalSendBytes;

  if m_CountSec<>0 then
    m_SendRate := m_SendByte/m_CountSec
  else
    m_SendRate := 0;
end;


procedure TDIMonitor.AddRecvByte(nRecvByte: DWORD);
begin
  try
    m_MonitorLock.Lock;
    m_nTotalRecvBytes := m_nTotalRecvBytes + nRecvByte;
    m_RecvCount := m_RecvCount +1;
    CalcCapability;
  finally
    m_MonitorLock.UnLock;
  end;
end;

procedure TDIMonitor.AddSendByte(nSendByte: DWORD);
begin
  try
    m_MonitorLock.Lock;
    m_nTotalSendBytes := m_nTotalSendBytes + nSendByte;
    m_SendCount := m_SendCount + 1;
    CalcCapability;
  finally
    m_MonitorLock.UnLock;
  end;
end;

//增加日志次数
procedure TDIMonitor.AddLogCount;
begin
  try
    m_MonitorLock.Lock;
    m_LogCount := m_LogCount + 1;
  finally
    m_MonitorLock.UnLock;
  end;
end;

//IOCP挂起数加1 (Recv)
procedure TDIMonitor.AddIOCPRecv;
begin
  try
    m_MonitorLock.Lock;
    m_iocpRecvCount := m_iocpRecvCount + 1;
  finally
    m_MonitorLock.UnLock;
  end;
end;

//IOCP挂起数减1 (Recv)
procedure TDIMonitor.SubIOCPRecv;                      
begin
  try
    m_MonitorLock.Lock;
    m_iocpRecvCount := m_iocpRecvCount - 1;
  finally
    m_MonitorLock.UnLock;
  end;
end;

⌨️ 快捷键说明

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