где lpBuffer – структура
описания состояния памяти:
typedef struct _MEMORYSTATUS
{
DWORD dwLength;
DWORD dwMemoryLoad; -
процент использования памяти
DWORD dwTotalPhys; - общее
кол-во памяти
DWORD dwAvailPhys; - кол-во
свободной памяти
DWORD
dwTotalPageFile; - кол-во памяти в файле подкачки
DWORD
dwAvailPageFile; - кол-во свободной памяти в файле подкачки
DWORD dwTotalVirtual; -
размер памяти процесса
DWORD dwAvailVirtual;
-свободная память процесса
} MEMORYSTATUS,
*LPMEMORYSTATUS;
Память, как и все остальные
ресурсы. Имеет обыкновение заканчиваться.
Сущетвует 3 категории нехватки
памяти:
LowMemory – свободно
256Кб памяти. Система при этом рассылает приложениям сообщение
WM_HIBERNATE. Приложение в ответ на сообщение должно
освободить память, выделенную функцией VirtaulAlloc, освободить
неиспользуемые ресурсы GDI.
VeryLowMemory –
свободно 160Кб памяти. Система рассылает приложениям сообщение
WM_CLOSE. В ответ на это сообщение, приложения должны завершить
работу и полность освободить память и ресурсы GDI.
CriticalMemory –
свободно меньше 32Кб. В этом состоянии запуск программ невозможен.
Система показывает стандартный диалог нехватки памяти и
перезагружается.
Иногда программе для работы
нужно больше памяти, чем свободно. В этом случае можно
воспользоваться функцией:
BOOL SHCloseApps(DWORD
dwMemNeed );
где, dwMemNeed - объем
памяти, который необходимо освободить.
При этом система посылает
остальным приложениям сообщение WM_CLOSE до тех пор, пока не будет
доступно необходимое количество памяти (если это возможно вообще).
Если это не возможно по каким-то причинам, то функция вернет false,
и придется использовать столько памяти, сколько доступно, или пойти
на ухищрения типа memory-mapped files.
Память делится между памятью
программ (Program Memory) и памятью файлов (Storage Memory). В
настройках системы можно посмотреть и установить распределение
использования память вручную:
Но есть способ сделать это
программно/ Для этого существуют недокументированные функции из
core.dll:
GetSystemMemoryDivision(LPDWORD,LPDWORD,LPDWORD);
SetSystemMemoryDivision(DWORD);
Получение текущего
распределения памяти:
BOOL
GetSystemMemoryDivision(
LPDWORD pmemStorage,
LPDWORD pmemRAM,
LPDWORD pmemTotal);
где
pmemStorage –
размер памяти, отданной под хранилище
pmemRAM - размер
памяти отданной под программы
pmemTotal –
общий размер памяти
Установка распределения памяти:
DWORD
SetSystemMemoryDivision(DWORD memStorage);
где
memStorage - размер
памяти, выделяемый под хранилище, в страницах памяти
Как было ск5азано выше,
выделение памяти в системе происходит кусками, кратными размеру
страницы. Это следует учитывать в приложениях, активно использующих
динамическую память.
Размер страницы памяти можно
определить с помощью функции GetSystemInfo():
void
GetSyetemInfo(LPSYSTEM_INFO lpSystemInfo);
структура LPSYSTEM_INFO
описывает характеристики процессора, из которых и можно получит
интересующее нас значение:
typedef struct _SYSTEM_INFO { union {DWORD dwOemId; struct {WORD wProcessorArchitecture; // тип архитектуры процессора
WORD wReserved;};};DWORD dwPageSize; // размер страницы памяти
LPVOID lpMinimumApplicationAddress; // адрес начала области памяти для приложений
LPVOID lpMaximumApplicationAddress; // адрес конца области памяти для приложений
DWORD dwActiveProcessorMask; DWORD dwNumberOfProcessors; // количество процессоров в системе
DWORD dwProcessorType; // тип процессора
DWORD dwAllocationGranularity;WORD wProcessorLevel;WORD wProcessorRevision;} SYSTEM_INFO, *LPSYSTEM_INFO;
Эта
же функция, совместно с функцией GetVersionInfoEx может
использоваться для л/р “Просмотр информации о системе”
Power Manager.
Функция получения состояния
основной и дополнительной батарей:
Позиционирование на
определенную запись осуществляется с помощью функции CeSeekDatabase:
CeSeekDatabase(
hNewDB, // хендл таблицы
CEDB_SEEK_BEGINNING, //
условие позиционирования
0, // номер записи в
базе данных или указатель на значение
&dwIndex); // индекс
записи
Прочитать запись можно с
помощью функции CeReadRecordProps:
CeReadRecordProps (
hNewDB, // хендл
таблицы
CEDB_ALLOWREALLOC, // флаг
управления памятью
&wProps, //
количество полей в записи
NULL, // перечень полей
&(LPBYTE)pBuff, //
буффер, куда сложены данные
&cbData); // размер
буфера
Возвращаемые данные
складываются в массив структур:
typedef struct _CEPROPVAL {
CEPROPID propid; // тип поля (строка, целое, дата, BLOB и т.д.)
WORD wLenData; // длина данных
WORD wFlags; // флаги
CEVALUNION val; // сами данные
} CEPROPVAL;
Получить значение можно так :
PCEPROPVAL pRecord =
(PCEPROPVAL)pBuff;
szValue = pRecord->val.lpwstr;
Пример чтения всех записей
таблицы:
while(CeSeekDatabase(hNewDB,
CEDB_SEEK_BEGINNING, i, &dwIndex)!=0)
Физические характеристики батареи: DWORD BatteryVoltage; - емкость батреи (mV) - Не емкость, а напряжение батареи. Про емкость правильно сказано дальше.
Добавлять комментарии могут только зарегистрированные пользователи. [ Регистрация | Вход ]