С++: Получение информации о состоянии памяти

В этой статье хотелось бы поговорить о создании простой программы, отражающей состояние памяти компьютера, ее распределение, если говорить более конкретно.

Начнем с того, что разобьем доступную нам память на три категории — физическая память, виртуальная память и файл подкачки. Для тех, кто сталкивается впервые с понятием файла подкачки, поясним — это специальный файл, который является как бы продолжением или дополнением оперативной памяти вашего компьютера.

Файл этот использует для своей работы память жесткого диска компьютера, начиная работу, когда оперативной памяти компьютеру не хватает для действий.

По сравнению в оперативной памятью, доступ и чтение памяти жестких дисков происходит гораздо медленнее. Например, если запустить несколько программ, активно использующих вашу оперативную память, часть из них, с меньшим приоритетом, будет «отдана» файлу подкачки.

При обращении же к такой программе, она снова «передается» к оперативной памяти для ускорения работы.

Для написания программы будем пользоваться C++ Builder 6.0. Чтобы получить доступ к памяти компьютера для сбора информации, воспользуемся следующим кодом:

MEMORYSTATUS theStatus;
ZeroMemory(&theStatus,sizeof(theStatus));
theStatus.dwLength = sizeof(theStatus);
GlobalMemoryStatus(&theStatus);

После чего в созданной переменной theStatus будет содержаться необходимая нам информация. Для удобоваримого ее отображения создадим на форме три диаграммы TChart. После чего необходимо лишь записать нужную нам информацию в эти диаграммы. Приведем полный листинг программы:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <stdio.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
MEMORYSTATUS theStatus;
ZeroMemory(&theStatus,sizeof(theStatus));
theStatus.dwLength = sizeof(theStatus);
GlobalMemoryStatus(&theStatus);
Series1->Add(theStatus.dwTotalPhys-theStatus.dwAvailPhys,"Занято физ.памяти",clRed);
Series1->Add(theStatus.dwAvailPhys,"Свободно физ.памяти",clGreen);
Series2->Add(theStatus.dwTotalVirtual-theStatus.dwAvailVirtual,"Занято вирт.памяти",clRed);
Series2->Add(theStatus.dwAvailVirtual,"Свободно вирт.памяти",clGreen);
Series3->Add(theStatus.dwTotalPageFile-theStatus.dwAvailPageFile,"Занято пространства в файле подкачки",clRed);
Series3->Add(theStatus.dwAvailPageFile,"Свободно пространства в файле подкачки",clGreen);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------

Кнопка Button3 в данном случае служит лишь для закрытия приложения. Удачи!

16 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.