Files
mir_server/server/SessionServer/PerformanceWatcher.cpp
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

586 lines
16 KiB
C++

/*
#include <stdio.h>
#include <stdlib.h>
#include <crtdbg.h>
#include <tchar.h>
#include <Windows.h>
#include <_ast.h>
#include <_memchk.h>
#include <Thread.h>
#include <Lock.h>
#include <Tick.h>
#include <QueueList.h>
#include <CustomSocket.h>
#include <NamedPipe.h>
#include <ClassedWnd.h>
#include <commctrl.h>
#include <time.h>
#include "ShareUtil.h"
#include "BufferAllocator.h"
#include "AppItnMsg.h"
#include "SockModel/CustomWorkSocket.h"
#include "SockModel/CustomClientSocket.h"
#include "SockModel/CustomServerClientSocket.h"
#include "SockModel/CustomServerSocket.h"
#include "gate/GateProto.h"
#include "gate/CustomServerGateUser.h"
#include "gate/CustomServerGate.h"
#include "gate/CustomGateManager.h"
#include "ServerDef.h"
#include "SQL.h"
#include "SSProto.h"
#include "SSGateUser.h"
#include "SSGate.h"
#include "SessionClient.h"
#include "SessionServer.h"
#include "SSGateManager.h"
#include "SSManager.h"
*/
#include "StdAfx.h"
/*
#include "PerformanceWatcher.h"
#pragma comment(lib, "comctl32")
class CPerformanceWnd : public wylib::window::CClassedWnd
{
public:
typedef CClassedWnd Inherited;
static const TCHAR WndClassName[];
private:
HFONT m_hEditFont;
HWND m_hEdit;
BOOL m_boShowing;
private:
VOID RegistWndClass()
{
WNDCLASS wndclass;
HINSTANCE hInstance = GetModuleHandle(NULL);
BOOL boClassRegisted = GetClassInfo(hInstance, WndClassName, &wndclass);
if ( !boClassRegisted || wndclass.lpfnWndProc != getClassedWndProc() )
{
if ( boClassRegisted )
{
UnregisterClass(WndClassName, hInstance);
}
//int nCmdShow;
//此窗口对象的一些属性设置
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = getClassedWndProc();
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance;
wndclass.hIcon = NULL;//LoadIcon(NULL, IDI_ASTERISK); //IDI_APPLICATION 普通应用程序图标, IDI_HAND 打叉红色图标
// IDI_QUESTION 问号图标, IDI_EXCLAMATION 感叹号图标 IDI_ASTERISK 信息图标
wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = WndClassName;
//用上边声明的窗口对象注册此窗口
if (!RegisterClass(&wndclass))
{
MessageBox(NULL, TEXT("This program requires Windows NT!"),
WndClassName, MB_ICONERROR);
return;
}
}
}
VOID CreatePerformanceWindow()
{
HINSTANCE hInstance = GetModuleHandle(NULL);
//注册完了就创建此窗口咯
HWND hwnd = MyCreateWindowEx(0,
WndClassName, //window class name
_T("会话状态"), //window caption
WS_CAPTION | WS_BORDER | WS_SYSMENU, //window style
CW_USEDEFAULT, //initial x position
CW_USEDEFAULT, //initial y position
520,120,
//CW_USEDEFAULT, //initial x size
//CW_USEDEFAULT, //initial x size
NULL, //parent window handle
NULL, //window menu handle
hInstance, //program instance handle
NULL); //creation parameters
}
protected:
LRESULT WndProc(HWND hwnd,UINT message,WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
m_hEdit = CreateWindow(
_T("EDIT"), // predefined class
NULL, // no window title
WS_CHILD | WS_VISIBLE |
ES_CENTER | ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN,
0, 0, 0, 0, // set size in WM_SIZE message
hwnd, // parent window
(HMENU) 101, // edit control ID
NULL,
NULL); // pointer not needed
SendMessage(m_hEdit, EM_SETREADONLY, TRUE, 0);//输入框只读
m_hEditFont = CreateFont(12, 0, 0, 0, 100, FALSE, FALSE, 0,
GB2312_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH | FF_MODERN, _T("宋体") );
SendMessage(m_hEdit, WM_SETFONT ,(WPARAM)m_hEditFont, 0);//WM_SETFONT
return 0;
case WM_SETFOCUS:
SetFocus(m_hEdit);
return 0;
case WM_SIZE:
MoveWindow(m_hEdit,
0, 0, // starting x- and y-coordinates
LOWORD(lParam), // width of client area
HIWORD(lParam), // height of client area
TRUE); // repaint window
return 0;
case WM_CLOSE:
m_boShowing = FALSE;
ShowWindow(hwnd, SW_HIDE);
return 0;
case WM_DESTROY:
DeleteObject(m_hEditFont);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
public:
CPerformanceWnd()
:Inherited()
{
m_hEditFont = 0;
m_hEdit = 0;
m_boShowing = FALSE;
RegistWndClass();
CreatePerformanceWindow();
}
~CPerformanceWnd()
{
if ( getHwnd() )
{
if ( m_hEdit )
{
DestroyWindow(m_hEdit);
m_hEdit = NULL;
}
DestroyWindow(getHwnd());
}
}
VOID SetEditText(LPCTSTR sText)
{
SetWindowText(m_hEdit, " ");
SendMessage(m_hEdit, EM_REPLACESEL ,0, (LPARAM)sText);//WM_SETFONT
}
VOID Show(INT nShow)
{
HWND hWnd = getHwnd();
m_boShowing = nShow;
ShowWindow(hWnd, nShow);
if (nShow)
UpdateWindow(hWnd);
}
inline BOOL showing(){ return m_boShowing; }
};
class CServerConnectionWnd : public wylib::window::CClassedWnd
{
public:
typedef CClassedWnd Inherited;
static const TCHAR WndClassName[];
private:
HWND m_hListView;
HFONT m_hFont;
BOOL m_boShowing;
BOOL m_boWantUpdate;
private:
VOID RegistWndClass()
{
WNDCLASS wndclass;
HINSTANCE hInstance = GetModuleHandle(NULL);
BOOL boClassRegisted = GetClassInfo(hInstance, WndClassName, &wndclass);
if ( !boClassRegisted || wndclass.lpfnWndProc != getClassedWndProc() )
{
if ( boClassRegisted )
{
UnregisterClass(WndClassName, hInstance);
}
//int nCmdShow;
//此窗口对象的一些属性设置
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = getClassedWndProc();
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance;
wndclass.hIcon = NULL;//LoadIcon(NULL, IDI_ASTERISK); //IDI_APPLICATION 普通应用程序图标, IDI_HAND 打叉红色图标
// IDI_QUESTION 问号图标, IDI_EXCLAMATION 感叹号图标 IDI_ASTERISK 信息图标
wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = WndClassName;
//用上边声明的窗口对象注册此窗口
if (!RegisterClass(&wndclass))
{
MessageBox(NULL, TEXT("This program requires Windows NT!"),
WndClassName, MB_ICONERROR);
return;
}
}
}
VOID CreateDisplayConnectWndWindow()
{
HINSTANCE hInstance = GetModuleHandle(NULL);
//注册完了就创建此窗口咯
HWND hwnd = MyCreateWindowEx(0,
WndClassName, //window class name
_T("已连接服务器"), //window caption
WS_CAPTION | WS_BORDER | WS_SYSMENU | WS_SIZEBOX | WS_MAXIMIZEBOX | WS_MINIMIZEBOX, //window style
CW_USEDEFAULT, //initial x position
CW_USEDEFAULT, //initial y position
520,320,
//CW_USEDEFAULT, //initial x size
//CW_USEDEFAULT, //initial x size
NULL, //parent window handle
NULL, //window menu handle
hInstance, //program instance handle
NULL); //creation parameters
}
VOID CreateWndFont()
{
m_hFont = CreateFont(12, 0, 0, 0, 100, FALSE, FALSE, 0,
GB2312_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH | FF_MODERN, _T("宋体") );
}
VOID CreateListView (HWND hWndParent)
{
RECT rcl;
// 确保相关通用控件DLL已导入
INITCOMMONCONTROLSEX icex;
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_LISTVIEW_CLASSES;
InitCommonControlsEx(&icex);
GetClientRect(hWndParent, &rcl); // 获取父窗口客户区域大小
// 创建客户端更新状态列表控件m_hEdit
m_hListView = CreateWindowEx(0UL, WC_LISTVIEW, "",
WS_VISIBLE | WS_BORDER | WS_CHILD | LVS_REPORT | LVS_EX_GRIDLINES | LVS_SINGLESEL,
0, 0, rcl.right, (rcl.bottom - rcl.top)*3/5, hWndParent, (HMENU)1,
GetModuleHandle(NULL), NULL); // 在WM_SIZE消息中处理大小, 让其适应窗口大小
// 设置列表控件的扩展样式
ListView_SetExtendedListViewStyleEx(m_hListView, 0,
LVS_EX_FLATSB | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_HEADERDRAGDROP | LVS_EX_ONECLICKACTIVATE );
//设置字体
SendMessage(m_hListView, WM_SETFONT ,(WPARAM)m_hFont, 0);
// 创建列
char szText[50] = "";
LV_COLUMN lvC;
lvC.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM ;
lvC.fmt = LVCFMT_LEFT;
lvC.pszText = szText;
char *pszClumnText1[] = { "服务器名称", "连接IP", "连接端口","连接时间"};
int ColumnWidths[] = { 200, 100, 60, 120 };
for (int i = 0; i < sizeof(pszClumnText1)/sizeof(char*); ++i)
{
lvC.cx = 120;
lvC.iSubItem = i;
wsprintf(szText, "%s", pszClumnText1[i]);
lvC.cx = 200;
if (ListView_InsertColumn(m_hListView, i, &lvC) == -1)
{
MessageBox(NULL, "函数ListView_InsertColumn(m_hEdit, i, &lvC)错误!", "", 0);
}
ListView_SetColumnWidth(m_hListView, i, ColumnWidths[i]);
}
}
protected:
LRESULT WndProc(HWND hwnd,UINT message,WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
CreateWndFont();
CreateListView (hwnd);
return 0;
case WM_PAINT:
{
PAINTSTRUCT pt;
RECT rt;
GetClientRect(hwnd, &rt);
BeginPaint(hwnd, &pt);
HGDIOBJ hObj = SelectObject(pt.hdc, (HGDIOBJ)m_hFont);
TextOut(pt.hdc, (rt.right - rt.left - 120)/2, (rt.bottom - 30), _T("点击此处刷新列表"), 16);
SelectObject(pt.hdc, hObj);
EndPaint(hwnd, &pt);
}
return 0;
case WM_SETFOCUS:
SetFocus(m_hListView);
return 0;
case WM_SIZE:
MoveWindow(m_hListView, 0, 0, LOWORD(lParam), HIWORD(lParam) - 40, TRUE);
return 0;
case WM_CLOSE:
m_boShowing = FALSE;
ShowWindow(hwnd, SW_HIDE);
return 0;
case WM_DESTROY:
return 0;
case WM_LBUTTONUP:
m_boWantUpdate = TRUE;
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
public:
CServerConnectionWnd():Inherited()
{
m_hListView = 0;
m_hFont = 0;
m_boShowing = FALSE;
m_boWantUpdate = FALSE;
InitCommonControls();
RegistWndClass();
CreateDisplayConnectWndWindow();
}
~CServerConnectionWnd()
{
if ( getHwnd() )
{
DestroyWindow(getHwnd());
}
}
VOID Show(INT nShow)
{
HWND hWnd = getHwnd();
m_boShowing = nShow;
ShowWindow(hWnd, nShow);
if (nShow)
UpdateWindow(hWnd);
}
VOID DisplayServerConnections(CPerformanceWatcher::CServerConnectionList &ServerList)
{
ListView_DeleteAllItems(m_hListView);
LV_ITEM Item;
CPerformanceWatcher::ServerConnetionInfo *pSrvInfo = ServerList;
INT_PTR nCount = ServerList.count();
CHAR sBuffer[256];
TICKCOUNT dwCurTick = _getTickCount();
ZeroMemory(&Item, sizeof(Item));
for (INT_PTR i=0; i<nCount; ++i)
{
Item.iItem = (int)i;
sprintf(sBuffer,"%s",pSrvInfo->sSrvName);
ListView_InsertItem(m_hListView, &Item);
ListView_SetItemText(m_hListView, i, 0, sBuffer);
strcpy(sBuffer, inet_ntoa(pSrvInfo->s_Addr.sin_addr));
ListView_SetItemText(m_hListView, i, 1, sBuffer);
sprintf(sBuffer, "%d", htons(pSrvInfo->s_Addr.sin_port));
ListView_SetItemText(m_hListView, i, 2, sBuffer);
sprintf(sBuffer, "%d秒", (dwCurTick - pSrvInfo->dwConnectTick) / 1000 );
ListView_SetItemText(m_hListView, i, 3, sBuffer);
pSrvInfo++;
}
m_boWantUpdate = FALSE;
}
inline BOOL showing(){ return m_boShowing; }
inline BOOL getWantUpdate(){ return m_boWantUpdate; };//刷新按钮状态
};
const TCHAR CPerformanceWnd::WndClassName[] = TEXT("SSMgrStateClass");
const TCHAR CServerConnectionWnd::WndClassName[] = TEXT("SSMgrSrvConnClass");
CPerformanceWatcher::CPerformanceWatcher(CSSManager *lpSSManager)
:Inherited(TRUE)
{
m_pSSManager = lpSSManager;
}
CPerformanceWatcher::~CPerformanceWatcher(void)
{
}
VOID CPerformanceWatcher::OnRountine()
{
MSG msg;
TICKCOUNT dwNextShowTick = 0, dwTick;
//生成消息队列
PeekMessage(&msg, 0, 0, 0, PM_NOREMOVE);
m_pPerformanceWnd = new CPerformanceWnd();
m_pServerConnectionWnd = new CServerConnectionWnd();
while ( !terminated() )
{
dwTick = _getTickCount();
if ( dwTick >= dwNextShowTick )
{
dwNextShowTick = dwTick + 1000;
if (m_pPerformanceWnd->showing())
ShowPerformance();
}
if (m_pServerConnectionWnd->getWantUpdate())
{
ShowServerConnections();
}
while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Sleep(16);
}
SafeDelete(m_pPerformanceWnd);
SafeDelete(m_pServerConnectionWnd);
}
*/
/*
VOID CPerformanceWatcher::ShowPerformance()
{
PERFORMANCEINFO m2001p1;
PERFORMANCEINFO m104p1, m104p3, m104p4;
int count = 0;
char buf[4*1024];
count += _stprintf(buf + count, "会话数量:%d\r\n",
m_pSSManager->getSessionServer()->GetSessionCount());
count += _stprintf(buf + count,"数据服务器:%3d 引擎服务器:%3d\r\n",
m_pSSManager->getSessionServer()->GetDBClientCount(),
m_pSSManager->getSessionServer()->GetLogicClientCount(0) );
m_pSSManager->getGateManager()->getMainLoopPerformance( &MainLoop );
m_pSSManager->getGateManager()->getMainProcessPerformance( &ProcPerformance );
m_pSSManager->getGateManager()->getMainSleepPerformance( &SleepPerformance );
m_pSSManager->getGateManager()->getInternalMessageProcessPerformance( &IntMsgProcPerformance );
m_pSSManager->getGateManager()->getExecuteGatesPerformance( &ExecGatesPerformance );
count += _stprintf(buf + count,"网关管理器性能(LP:%d/%d/%d MP:%d/%d/%d IMP:%d/%d/%d EG:%d/%d/%d)\r\n",
(UINT)MainLoop.nLastLoop, (UINT)MainLoop.nMinLoop, (UINT)MainLoop.nMaxLoop,
(UINT)ProcPerformance.dwLastTick, (UINT)ProcPerformance.dwMinTick, (UINT)ProcPerformance.dwMaxTick,
(UINT)SleepPerformance.dwLastTick, (UINT)SleepPerformance.dwMinTick, (UINT)SleepPerformance.dwMaxTick,
(UINT)IntMsgProcPerformance.dwLastTick, (UINT)IntMsgProcPerformance.dwMinTick, (UINT)IntMsgProcPerformance.dwMaxTick,
(UINT)ExecGatesPerformance.dwLastTick, (UINT)ExecGatesPerformance.dwMinTick, (UINT)ExecGatesPerformance.dwMaxTick
);
//CSSGate *pGate = (CSSGate*)m_pSSManager->getGateManager()->getGate(0);
pGate->getReadPerformance( &gRead );
pGate->getProcessReadPerformance( &gProcessRead );
pGate->getSendPerformance( &gSend );
pGate->getProcessUserPerformance( &gProcessUser );
pGate->getProcessUserMsgPerformance( &gProcUserMsg );
count += _stprintf(buf + count,"网关[0]性能(RC:%d/%d/%d PRC:%d/%d/%d SD:%d/%d/%d PU:%d/%d/%d PUM:%d/%d/%d[%d])\r\n",
(UINT)gRead.dwLastTick, (UINT)gRead.dwMinTick, (UINT)gRead.dwMaxTick,
(UINT)gProcessRead.dwLastTick, (UINT)gProcessRead.dwMinTick, (UINT)gProcessRead.dwMaxTick,
(UINT)gSend.dwLastTick, (UINT)gSend.dwMinTick, (UINT)gSend.dwMaxTick,
(UINT)gProcessUser.dwLastTick, (UINT)gProcessUser.dwMinTick, (UINT)gProcessUser.dwMaxTick,
(UINT)gProcUserMsg.dwLastTick, (UINT)gProcUserMsg.dwMinTick, (UINT)gProcUserMsg.dwMaxTick, pGate->getMaxTimeUserMsgIdent()
);
//pGate->getLoadUserLoginDataPerformance( &m2001p1 );
count += _stprintf(buf + count,"M2001性能(LULD:%d/%d/%d)\r\n",
(UINT)m2001p1.dwLastTick, (UINT)m2001p1.dwMinTick, (UINT)m2001p1.dwMaxTick
);
pGate->getCheckServerReadyPerformance(&m104p1);
pGate->getPostOpenSessionPerformance(&m104p3);
pGate->getUpdateUserLoginPerformance(&m104p4);
count += _stprintf(buf + count, "M104性能(CSR:%d/%d/%d POS:%d/%d/%d UUL:%d/%d/%d)\r\n",
(UINT)m104p1.dwLastTick, (UINT)m104p1.dwMinTick, (UINT)m104p1.dwMaxTick,
(UINT)m104p3.dwLastTick, (UINT)m104p3.dwMinTick, (UINT)m104p3.dwMaxTick,
(UINT)m104p4.dwLastTick, (UINT)m104p4.dwMinTick, (UINT)m104p4.dwMaxTick
);
//m_pPerformanceWnd->SetEditText(buf);
}
*/
/*
UINT STDCALL CPerformanceWatcher::EnumServerConnectionCallBack(CServerConnectionList *pServerList, CSessionClient *lpConnection)
{
ServerConnetionInfo SrvInfo;
_asncpytA(SrvInfo.sSrvName, lpConnection->getClientName());
SrvInfo.s_Addr = lpConnection->GetRemoteAddrIn();
SrvInfo.dwConnectTick = lpConnection->getConnectTick();
pServerList->add(SrvInfo);
return 0;
}
VOID CPerformanceWatcher::ShowServerConnections()
{
CServerConnectionList ServerList;
m_pSSManager->getSessionServer()->EnumConnections((CSessionServer::EnumConnectionFn)EnumServerConnectionCallBack, &ServerList);
m_pServerConnectionWnd->DisplayServerConnections(ServerList);
}
VOID CPerformanceWatcher::ShowPerformanceWindow(const BOOL boShow)
{
if ( m_pPerformanceWnd )
{
ShowPerformance();
m_pPerformanceWnd->Show(boShow ? SW_SHOW : SW_HIDE);
}
}
VOID CPerformanceWatcher::ShowServerConnectionWindow(const BOOL boShow)
{
if ( m_pServerConnectionWnd )
{
ShowServerConnections();
m_pServerConnectionWnd->Show(boShow ? SW_SHOW : SW_HIDE);
}
}
*/