Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
по дисциплине
«Системное программное обеспечение»
Москва 2020
Цель работы: получение практических навыков по использованию
Win32 API для исследования памяти Windows.
Задание:
Разработать программу, которая выдает информацию, получаемую
при использовании API GlobalMemoryStatus (при выводе информации
использовать диаграммы).
Ход работы
Для исследования памяти системы, разработаем программу с
графическим интерфейсом на основе функций Windows GDI.
Функция GlobalMemoryStatusEx возвращает структуру типа
MEMORYSTATUSEX. В ней содержатся (согласно документации):
Длина структуры;
Загруженность памяти в процентах;
Общий и доступный объемы физической памяти в байтах;
Размер максимального файла подкачки в байтах, и максимальный
его объем для текущего процесса.
Общий и доступный объемы виртуальной памяти в байтах для
вызываемого процесса.
Для отображения результатов вызова этой функции создадим в теле
программы окна таймер, который в результате обработки сообщения
WM_TIMER будет инициализировать перерисовку содержимого окна с
помощью функции InvalidateRect(), вызывающей сообщение WM_PAINT.
В теле обработки сообщения WM_PAINT начинаем отрисовку
BeginPaint, получаем необходимый контекст и передаем его функции
DrawStatus(), в теле которой вызывается GlobalMemoryStatusEx,
обрабатываются полученные данные и выводятся в виде текстовых
заголовков и диаграмм.
Для обрисовку диаграммы также создадим функцию DrawPie(), где
отрисовываем линии, AngleArc в зависимости от заданного угла, и заливаем
полученную фигуру.
2
Исходный код программы:
#include <windows.h>
#include <string.h>
#include <stdio.h>
#define TO_MB 1048576
if (!RegisterClassEx(&wcl))
return 0;
hwnd = CreateWindow(
szWinName,
"Memory usage",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
HWND_DESKTOP,
NULL,
hThisInst,
NULL
);
ShowWindow(hwnd, nWinMode);
UpdateWindow(hwnd);
SetTimer(hwnd, 1, 3000, NULL);
3
void DrawPie(HDC hdc, int nX, int nY, DWORD dwRadius, float xSweepAngle) {
float xStartAngle = 0;
BeginPath(hdc);
SelectObject(hdc, GetStockObject(GRAY_BRUSH));
MoveToEx(hdc, nX, nY, (LPPOINT) NULL);
AngleArc(hdc, nX, nY, dwRadius, xStartAngle, xSweepAngle);
LineTo(hdc, nX, nY);
EndPath(hdc);
StrokeAndFillPath(hdc);
}
char mem[19];
sprintf(mem, "Memory usage: %ld%%", statex.dwMemoryLoad);
TextOut(hdc, 20, 0,mem, sizeof(mem));
DrawPie(hdc, 100, 150, 70, statex.dwMemoryLoad*3.6);
switch (message){
case WM_LBUTTONDOWN:
KillTimer(hwnd,1);
break;
case WM_DESTROY:
4
PostQuitMessage(0);
KillTimer(hwnd,1);
break;
case WM_PAINT:
GetClientRect(hwnd, &Rect);
hdc = BeginPaint(hwnd, &ps);
hCmpDC = CreateCompatibleDC(hdc);
hBmp = CreateCompatibleBitmap(hdc, Rect.right - Rect.left,
Rect.bottom - Rect.top);
SelectObject(hCmpDC, hBmp);
LOGBRUSH br;
br.lbStyle = BS_SOLID;
br.lbColor = 0xEECCEE;
HBRUSH brush;
brush = CreateBrushIndirect(&br);
FillRect(hCmpDC, &Rect, brush);
DeleteObject(brush);
DrawStatus(hCmpDC);
SetStretchBltMode(hdc, COLORONCOLOR);
BitBlt(hdc, 0, 0, Rect.right - Rect.left, Rect.bottom - Rect.top,
hCmpDC, 0, 0, SRCCOPY);
DeleteDC(hCmpDC);
DeleteObject(hBmp);
hCmpDC = NULL;
EndPaint(hwnd, &ps);
break;
case WM_TIMER:
InvalidateRect(hwnd, NULL, FALSE);
break;
default:
return DefWindowProc(hwnd, message, wParam,lParam);
}
return 0;
}
5
Рисунок 1 – готовая программа отслеживания использования памяти
Вывод: в результате выполнения лабораторной работы получены
практические навыки исследования памяти Windows средствами Win32 API,
разработана программа с графическим интерфейсом, позволяющая в
реальном времени раз в 3 секунды получать информацию об использовании
памяти.