/
devofthefour
/
ITPractice
Обзор
Документация
Войти
/
devofthefour
/
ITPractice
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/util.hpp
103 строки
4 KB
devofthefour
Новые методы util.hpp
25 дек 2025, 14:33
25 дек 2025, 14:33
1485b47
Код
Авторство
О чём код?
#pragma once #include <windows.h> #include <string> #include <deque> #include <vector> #define ID_TIMER 1 #define UPDATE_INTERVAL 1000 // ms #define MAX_HISTORY 300 // 5 минут истории при обновлении раз в секунду #define CHART_WIDTH 400 #define CHART_HEIGHT 150 // Структуры для хранения истории метрик struct MetricHistory { std::deque<double> cpu; std::deque<double> memory; std::deque<double> virtualMemory; std::vector<std::deque<double>> diskUsage; std::vector<std::wstring> diskNames; }; // Структура для информации о дисках struct DiskInfo { std::wstring name; double usage; DWORDLONG total; DWORDLONG free; }; // Функция для преобразования wstring в UTF-8 string std::string WStringToUTF8(const std::wstring& wstr) { if (wstr.empty()) return std::string(); int size_needed = WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), (int)wstr.size(), NULL, 0, NULL, NULL); std::string str(size_needed, 0); WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), (int)wstr.size(), &str[0], size_needed, NULL, NULL); return str; } // Функция для преобразования wstring в локальную кодовую страницу (ANSI) std::string WStringToANSI(const std::wstring& wstr) { if (wstr.empty()) return std::string(); int size_needed = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), (int)wstr.size(), NULL, 0, NULL, NULL); std::string str(size_needed, 0); WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), (int)wstr.size(), &str[0], size_needed, NULL, NULL); return str; } // Форматирование байтов в читаемый вид std::wstring FormatBytes(DWORDLONG bytes) { const wchar_t* suffixes[] = { L"Б", L"КБ", L"МБ", L"ГБ", L"ТБ" }; int i = 0; double dblBytes = static_cast<double>(bytes); while (dblBytes >= 1024.0 && i < 4) { dblBytes /= 1024.0; i++; } wchar_t buffer[64]; // Форматируем без лишних знаков после запятой if (dblBytes < 10.0) { swprintf(buffer, 64, L"%.2f %s", dblBytes, suffixes[i]); } else if (dblBytes < 100.0) { swprintf(buffer, 64, L"%.1f %s", dblBytes, suffixes[i]); } else { swprintf(buffer, 64, L"%.0f %s", dblBytes, suffixes[i]); } return buffer; } // Получение информации о дисках std::vector<DiskInfo> GetDiskUsage() { std::vector<DiskInfo> diskInfo; wchar_t drives[256]; if (GetLogicalDriveStringsW(256, drives)) { for (wchar_t* drive = drives; *drive; drive += wcslen(drive) + 1) { UINT type = GetDriveTypeW(drive); if (type == DRIVE_FIXED) { // Только фиксированные диски ULARGE_INTEGER freeBytes, totalBytes, totalFreeBytes; if (GetDiskFreeSpaceExW(drive, &freeBytes, &totalBytes, &totalFreeBytes)) { DiskInfo info; info.name = drive; info.total = totalBytes.QuadPart; info.free = freeBytes.QuadPart; info.usage = 100.0 * (totalBytes.QuadPart - freeBytes.QuadPart) / totalBytes.QuadPart; diskInfo.push_back(info); } } } } return diskInfo; }