您的位置:首页 > 科技 > IT业 > 网站服务器是什么东西_岳阳建站公司_安徽网络优化公司_陕西网站建设制作

网站服务器是什么东西_岳阳建站公司_安徽网络优化公司_陕西网站建设制作

2024/10/6 20:26:54 来源:https://blog.csdn.net/Flame_Cyclone/article/details/142370112  浏览:    关键词:网站服务器是什么东西_岳阳建站公司_安徽网络优化公司_陕西网站建设制作
网站服务器是什么东西_岳阳建站公司_安徽网络优化公司_陕西网站建设制作

CPerformHelper.h

#pragma once#include <windows.h>
#include <tchar.h>
#include <string>
#include <pdh.h>
#include <string>
#include <mutex>
#include <thread>
#include <map>#ifdef _UNICODE
using _tstring = std::wstring;
#else
using _tstring = std::string;
#endif// CPU 使用率
#define PERFM_PATH_CPU_UTILITY              "\\Processor Information(_Total)\\% Processor Utility"// CPU 性能
#define PERFM_PATH_CPU_PERFORMANCE          "\\Processor Information(_Total)\\% Processor Performance"// CPU 主频
#define PERFM_PATH_CPU_FREQUENCY            "\\Processor Information(_Total)\\Processor Frequency"// 磁盘读写
#define PERFM_PATH_DISK_READ_RATE           "\\PhysicalDisk(_Total)\\Disk Read Bytes/sec"
#define PERFM_PATH_DISK_WRITE_RATE          "\\PhysicalDisk(_Total)\\Disk Write Bytes/sec"// 网络收发
#define PERFM_PATH_NETWORK_RECV_RATE        "\\Network Interface(*)\\Bytes Received/sec"
#define PERFM_PATH_NETWORK_SENT_RATE        "\\Network Interface(*)\\Bytes Sent/sec"// GPU
#define PERFM_PATH_GPU_UTILITY              "\\GPU Engine(*)\\Utilization Percentage"#ifdef UNICODE
using PerfMonInfo = std::map<std::wstring, HCOUNTER> ;
#else
using PerfMonInfo = std::map<std::string, HCOUNTER>;
#endifclass CPerformHelper
{
public:CPerformHelper();virtual ~CPerformHelper();// 初始化bool Initialize();// 反初始化void Uninitialize();// 添加性能计数器bool AddCounter(const _tstring& strCounterPath);// 移除性能计数器bool RemoveCounter(const _tstring& strCounterPath);// 设置性能采集时间间隔void SetCollectInterval(DWORD millisecond = 1000);// 获取性能计数器数值bool GetFormattedCounterValue(const _tstring&  strCounterPath, DWORD dwFormat, PPDH_FMT_COUNTERVALUE pValue);// 获取性能计数器数值数组bool GetFormattedCounterArray(const _tstring&  strCounterPath, DWORD dwFormat, PPDH_FMT_COUNTERVALUE pValue);// 开始采集数据bool StartCollect();private:void _Sleep(int millisecond);private:HQUERY m_hQuery;bool m_fQuit;DWORD m_msCollectInterval;std::mutex m_Mutex;PerfMonInfo m_hPerfMonInfos;std::thread m_task;
};

CPerformHelper.cpp

#include "CPerformHelper.h"
#include <pdh.h>
#include <pdhmsg.h>#pragma comment(lib, "pdh.lib")CPerformHelper::CPerformHelper():m_fQuit(false),m_hQuery(NULL),m_msCollectInterval(1000)
{}CPerformHelper::~CPerformHelper()
{Uninitialize();
}void CPerformHelper::_Sleep(int millisecond)
{do{const int span = 1;if (millisecond < span){std::this_thread::sleep_for(std::chrono::milliseconds(millisecond));return;}clock_t tmBegin = clock();while (true){if (::clock() - tmBegin > millisecond){break;}if (m_fQuit){break;}std::this_thread::sleep_for(std::chrono::milliseconds(span));}} while (false);
}bool CPerformHelper::Initialize()
{PDH_STATUS status = ERROR_SUCCESS;if (NULL == m_hQuery){status = PdhOpenQuery(NULL, 0, &m_hQuery);}if (ERROR_SUCCESS != status){return false;}return true;
}void CPerformHelper::Uninitialize()
{m_fQuit = true;if (m_task.joinable()){m_task.join();}m_fQuit = false;if (m_hQuery){::PdhCloseQuery(m_hQuery);m_hQuery = NULL;}for (auto& item : m_hPerfMonInfos){if (NULL != item.second){::PdhRemoveCounter(item.second);}}m_hPerfMonInfos.clear();
}bool CPerformHelper::AddCounter(const _tstring& strCounterPath)
{HCOUNTER hCounter = NULL;PDH_STATUS status = ERROR_SUCCESS;status = ::PdhAddCounter(m_hQuery, strCounterPath.c_str(), 0, &hCounter);if (ERROR_SUCCESS != status){return false;}m_Mutex.lock();m_hPerfMonInfos.insert(std::make_pair(strCounterPath, hCounter));m_Mutex.unlock();return true;
}bool CPerformHelper::RemoveCounter(const _tstring& szCounterPath)
{bool fResult = false;m_Mutex.lock();auto itFind = m_hPerfMonInfos.find(szCounterPath);if (itFind != m_hPerfMonInfos.end()){::PdhRemoveCounter(itFind->second);m_hPerfMonInfos.erase(itFind);fResult = true;}m_Mutex.unlock();return fResult;
}void CPerformHelper::SetCollectInterval(DWORD millisecond)
{if (millisecond < 100){m_msCollectInterval = 100;}m_msCollectInterval = millisecond;
}bool CPerformHelper::StartCollect()
{PDH_STATUS status = ERROR_SUCCESS;status = ::PdhCollectQueryData(m_hQuery);if (ERROR_SUCCESS != status){return false;}m_task = std::move(std::thread([&]() {PDH_STATUS status = ERROR_SUCCESS;while ((ERROR_SUCCESS == status) && !m_fQuit){status = ::PdhCollectQueryData(m_hQuery);if (ERROR_SUCCESS != status){break;}_Sleep(m_msCollectInterval);}}));return ERROR_SUCCESS == status;
}bool CPerformHelper::GetFormattedCounterValue(const _tstring& strCounterPath, DWORD dwFormat, PPDH_FMT_COUNTERVALUE pValue)
{PDH_STATUS status = ERROR_SUCCESS;auto itFind = m_hPerfMonInfos.find(strCounterPath);if (m_hPerfMonInfos.end() == itFind){return false;}status = ::PdhGetFormattedCounterValue(itFind->second,dwFormat,(LPDWORD)NULL,pValue);return ERROR_SUCCESS == status;
}bool CPerformHelper::GetFormattedCounterArray(const _tstring& strCounterPath, DWORD dwFormat, PPDH_FMT_COUNTERVALUE pValue)
{PPDH_FMT_COUNTERVALUE_ITEM pAryValue = NULL;PDH_STATUS status = ERROR_SUCCESS;DWORD dwBufferSize = 0;DWORD dwItemCount = 0;auto itFind = m_hPerfMonInfos.find(strCounterPath);if (m_hPerfMonInfos.end() == itFind){return false;}do{status = ::PdhGetFormattedCounterArray(itFind->second,dwFormat,&dwBufferSize,&dwItemCount,NULL);if (PDH_MORE_DATA != status){break;}pAryValue = (PPDH_FMT_COUNTERVALUE_ITEM)::HeapAlloc(::GetProcessHeap(), 0, dwBufferSize);if (NULL == pAryValue){break;}status = ::PdhGetFormattedCounterArray(itFind->second,dwFormat,&dwBufferSize,&dwItemCount,pAryValue);PDH_FMT_COUNTERVALUE value = { 0 };for (int i = 0; i < dwItemCount; i++){if (PDH_FMT_DOUBLE == dwFormat){value.doubleValue += pAryValue[i].FmtValue.doubleValue;}if (PDH_FMT_LARGE == dwFormat){value.largeValue += pAryValue[i].FmtValue.largeValue;}if (PDH_FMT_LONG == dwFormat){value.longValue += pAryValue[i].FmtValue.longValue;}}if (pValue){*pValue = value;}} while (false);if (pAryValue){::HeapFree(::GetProcessHeap(), 0, pAryValue);}return ERROR_SUCCESS == status;
}

main.cpp

#include <iostream>
#include "CPerformHelper.h"int main()
{CPerformHelper perfmon;perfmon.Initialize();perfmon.SetCollectInterval(1000);perfmon.AddCounter(_T(PERFM_PATH_CPU_UTILITY));perfmon.AddCounter(_T(PERFM_PATH_DISK_READ_RATE));perfmon.AddCounter(_T(PERFM_PATH_DISK_WRITE_RATE));perfmon.AddCounter(_T(PERFM_PATH_CPU_PERFORMANCE));perfmon.AddCounter(_T(PERFM_PATH_CPU_FREQUENCY));perfmon.AddCounter(_T(PERFM_PATH_NETWORK_RECV_RATE));perfmon.AddCounter(_T(PERFM_PATH_NETWORK_SENT_RATE));perfmon.AddCounter(_T(PERFM_PATH_GPU_UTILITY));perfmon.StartCollect();PDH_FMT_COUNTERVALUE value = { 0 };double lfFrequency = 0.0f;while (true){//获取CPU占用率if (perfmon.GetFormattedCounterArray(_T(PERFM_PATH_CPU_UTILITY), PDH_FMT_DOUBLE, &value)){printf("CPU Usage: %.2lf\r\n", value.doubleValue);}//获取GPU占用率if (perfmon.GetFormattedCounterArray(_T(PERFM_PATH_GPU_UTILITY), PDH_FMT_DOUBLE, &value)){printf("GPU Usage: %.2lf\r\n", value.doubleValue);}//获取CPU性能if (perfmon.GetFormattedCounterArray(_T(PERFM_PATH_CPU_FREQUENCY), PDH_FMT_DOUBLE, &value)){lfFrequency = value.doubleValue;}//获取CPU性能if (perfmon.GetFormattedCounterArray(_T(PERFM_PATH_CPU_PERFORMANCE), PDH_FMT_DOUBLE, &value)){printf("Performance: %.2lfGhz\r\n", value.doubleValue / 100.0f * lfFrequency / 1000.0f);}//获取硬盘读速度if (perfmon.GetFormattedCounterArray(_T(PERFM_PATH_DISK_READ_RATE), PDH_FMT_DOUBLE, &value)){printf("Read: %.2lfMB\r\n", value.doubleValue / 1048576.0f);}//获取硬盘写速度if (perfmon.GetFormattedCounterArray(_T(PERFM_PATH_DISK_WRITE_RATE), PDH_FMT_DOUBLE, &value)){printf("Write: %.2lfMB\r\n", value.doubleValue / 1048576.0f);}//获取网络读速度if (perfmon.GetFormattedCounterArray(_T(PERFM_PATH_NETWORK_RECV_RATE), PDH_FMT_DOUBLE, &value)){printf("Recv: %.2lfMbps\r\n", value.doubleValue / 1048576.0f * 8);}//获取网络写速度if (perfmon.GetFormattedCounterArray(_T(PERFM_PATH_NETWORK_SENT_RATE), PDH_FMT_DOUBLE, &value)){printf("Sent: %.2lfMbps\r\n", value.doubleValue / 1048576.0f * 8);}printf("\r\n");::Sleep(1000);}return 0;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com