Информация об окружении
В данном разделе мы поговорим об интерфейсах предоставляющих различную информацию об окружении. С помощью них мы можем получить данные о системе, информацию, о количестве процессоров в системе, потоках. Эти интерфейсы представлены в модуле OtlCommon.pas.
Основной интерфейс, предоставляющий данную информации об окружении, является IOmniEnvironment. Он в свою очередь имеет следующие свойства и методы:
Интерфейс IOmniEnvironment
IOmniEnvironment = interface ['{4F9594E2-8B88-483C-9616-85B50493406D}']
. . .
property Process: IOmniProcessEnvironment read GetProcess;
property System: IOmniSystemEnvironment read GetSystem;
property Thread: IOmniThreadEnvironment read GetThread;
end; { IOmniEnvironment }
Данный интерфейс возвращает информацию о процессе (Process), системе (System) и потоке (Thread). Как видите данный интерфейс, возвращает ссылки на другие интерфейсы, дающие более подробную информацию. Стоит сказать также, что программист в некоторых случаях может управлять данной информацией (изменять ее). Это в основном касается интерфейсов IOmniProcessEnvironment и IOmniAffinity которых мы рассмотрим далее.
Рассмотрим более подробно данные интерфейсы:
Интерфейс IOmniProcessEnvironment
IOmniProcessEnvironment = interface ['{98D6BDA3-840B-4E19-B01D-633E6A239FE9}']
function GetAffinity: IOmniAffinity;
function GetMemory: TOmniProcessMemoryCounters;
function GetPriorityClass: TOmniProcessPriorityClass;
function GetTimes: TOmniProcessTimes;
//
property Affinity: IOmniAffinity read GetAffinity;
property Memory: TOmniProcessMemoryCounters read GetMemory;
property PriorityClass: TOmniProcessPriorityClass read GetPriorityClass;
property Times: TOmniProcessTimes read GetTimes;
end; { IOmniProcessEnvironment }
Интерфейс возвращает информацию о задействованных процессорах, используемой памяти, приоритете процесса и времени выполнения.
Для определения памяти занимаемым процессом используются метод Memory который в свою очередь возвращает TOmniProcessMemoryCounters, которая на самом деле является структурой _PROCESS_MEMORY_COUNTERS которая на выходе и передает нужную нам информацию о занимаемой процессом памяти. Аналогично информацию о памяти Вы смогли бы получить, если бы использовали GetProcessMemoryInfo, однако OTL делает это за вас.
Сама структура _PROCESS_MEMORY_COUNTERS определена как:
_PROCESS_MEMORY_COUNTERS
_PROCESS_MEMORY_COUNTERS = packed record
cb: DWORD; // Размер структуры в байтах.
PageFaultCount: DWORD;
PeakWorkingSetSize: DWORD;
WorkingSetSize: DWORD; // Занимаемая процессом память, нужный нам параметр
QuotaPeakPagedPoolUsage: DWORD;
QuotaPagedPoolUsage: DWORD;
QuotaPeakNonPagedPoolUsage: DWORD;
QuotaNonPagedPoolUsage: DWORD;
PagefileUsage: DWORD;
PeakPagefileUsage: DWORD;
end;
Переменная WorkingSetSize и дает нужный нам объем занимаемой памяти
Информация о приоритете процесса возвращается как одно из значений
TOmniProcessPriorityClass = (pcIdle, pcBelowNormal, pcNormal, pcAboveNormal,
pcHigh, pcRealtime);
Информация о времени работы процесса возвращается в структуре TOmniProcessTimes.
TOmniProcessTimes
TOmniProcessTimes = record
CreationTime: TDateTime; {Дата создания}
UserTime : int64; {Время выполнения в пользовательском режиме}
KernelTime : int64; {Время выполнения в режиме ядра}
end; { TOmniProcessTimes }
Время выполнения представлено структурой данных FILETIME. Такая структура содержит два 32-битные значения (DWORD), которые объединяются в 64-битную переменную (Int64), в которой хранится число в 100-наносекундных интервалах (0.1 сек), прошедших с первого января 1601 года по Гринвичу. Дополнительные сведения о структуре _FILETIME см. в библиотеке MSDN.
Информация о задействованных процессорах системы возвращается в методе Affinity в интерфейсе IOmniAffinity, который определен как
IOmniAffinity
IOmniAffinity = interface
property AsString: string;
property Count: integer; {Задействовано процессоров}
property Mask: DWORD; {CPU affinity mask – маска родства}
end;
Маска родства, указывает, на каком процессоре(ах) выполняется поток данного процесса. В основном данные этой маски служат для управления планировщиком операционной системы и применяются для балансировки нагрузки. Подробнее смотрите в MSDN.
Пойдем далее, информация о системе представлена в интерфейсе IOmniSystemEnvironment:
Интерфейс IOmniSystemEnvironment
IOmniSystemEnvironment = interface ['{9BE1EFE3-4ABB-4C2F-B2A4-B014D0949FEC}']
function GetAffinity: IOmniAffinity;
//
property Affinity: IOmniAffinity read GetAffinity;
end; { IOmniSystemEnvironment }
Как видите, данный интерфейс в методе Affinity, возвращает уже знакомый нам интерфейс IOmniAffinity.
Информация о потоке, представлена в интерфейсе IOmniThreadEnvironment, который определен как:
IOmniThreadEnvironment
IOmniThreadEnvironment = interface
['{5C11FEC7-9FBE-423F-B30E-543C8240E3A3}']
['{5C11FEC7-9FBE-423F-B30E-543C8240E3A3}']
function GetAffinity: IOmniAffinity;
function GetID: cardinal;
{Информация о задействованных процессорах}
property Affinity: IOmniAffinity read GetAffinity;
property ID: cardinal read GetID; {Идентификатор потока}
end; { IOmniThreadEnvironment }
Комментариев нет:
Отправить комментарий