пятница, 9 октября 2009 г.

Память, процессы, железо...

Некоторым программам требуется собрать различные сведения о системе. HiAsm предоставлет такие компоненты для ваших программ, а я расскажу вам о них подробнее.

Большинство таких компонентов находится на вкладке "Система" панели компонентов. Лишь различные специфические компоненты типа громкости системы находятся на более подходящих вкладках, ну да о громкости речь уже была.

Нас будет интересовать только "Система". И первым делом - память. Компонент MemoryStatus очень прост в использовании, нужно лишь вызвать его метод для обновления сведений.

Скачать схему HiAsm

Таймер здесь срабатывает каждые 1000 миллисекунд, и память передаётся в замечательный компонент FormatStr, который формирует строку из значений. В его параметре Mask передаваемые значения представлены символами %х, где х - номер верхней точки. И готовая строка выдаётся в надпись, у которой AutoSize=False, потому что иначе размеры будут автоматически подгоняться, что может нарушить вид.

Можно представить данные и по-другому.

Скачать схему HiAsm

Здесь данные представлены на графике. Максимальное значение графика должно определяться автоматически, исходя из максимального размера памяти, но это невозможно из-за отсутствия нужного метода. Будем надеяться, что разработчики HiAsm примут меры. А пока прописываем в параметре MaxH размер вашей памяти (размерность зависит от выбранного значения Scale у компонента MemoryStatus). Разумеется, это подойдёт только для для компьютера с таким же размером памяти, а для другого размера нужно будет перекомпилировать её, выполнив запуск проекта с новым значением параметра.

Теперь о процессоре. Компонент CPUUsage вычисляет загрузку процессора. Её также удобно представить на графике, но точка для MaxH уже не нужна: загрузка вычисляется в процентах, так что максимум будет 100.

Скачать схему HiAsm

Здесь сложностей нет, зато изменился вид графика. Это тоже легко, просто поэкспериментируйте с его параметрами.

Ещё некоторую информацию о компьютере даёт компонент ComputerInfo.

Скачать схему HiAsm

Компонент EnumProcess предназначен для управления запущенными процессами. Функций у него немало.

Скачать схему HiAsm

Внимание! Эта схема может долго запускаться, но это не зависание.
Кажую секунду здесь перечисляются все процессы. Событие onProcess выдаёт имя каждого, и оно сохраняется в Memory. А затем через разветвитель читается память процесса и пользователь. Всё это запихивается в многомерный поток и подаётся в таблицу, которая каждую секунду очищается и снова заполняется.


Ну а сейчас я расскажу о группе компонентов, которые считывают характеристики "железа". Они тоже находятся на вкладке "Система", в группе "WMI". Все они очень похожи друг на друга, поэтому я рассмотрю лишь один из них. Пусть это будет MotherBoardInfo. Материнская плата.

Скачать схему HiAsm

Как видите, построение запроса и вывод ответа - дело лёгкое, аналогичное всем предыдущим примерам. Так что и другие компоненты для определения параметров железа вы сможете применять.

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

10 комментариев:

  1. Непонятно, для чего нужно Query. На onInfo всё равно ничего не выдаётся, а нижние точки работают и без Query.

    ОтветитьУдалить
  2. Да, впечатляющие функции при элементарности схем. Вся сложность спрятана внутри компонентов.
    Начинающему программеру тестирование железа и ОС - до лампочки, но вот работа по таймеру и способ заполнения строчек на экране - порадовали.
    Такое впечатление, что некоторые компоненты взаимодействуют между собой намного лучше, чем с другими. Например, Usage CPU и График. Одна связь - и все работает. Но вот попытки научить график реагировать на другие компоненты, типа кнопок, ни к чему не привели.
    Подскажите пример, когда удается на график отображать действия пользователя.

    ОтветитьУдалить
  3. Вводить только значения от -1 до 1, потому что в параметрах графика так задано. Также показана отрисовка синусоиды. Качать.

    ОтветитьУдалить
  4. А можно пример программы для убивания процеса.

    ОтветитьУдалить
  5. Я работаю с ком портом. В потоке я указываю сколько байт мне надо принять как можно проверить сколько байт пришло чтоб создать условия проверки правельности принятых байтов.

    ОтветитьУдалить
  6. А как правильно определить загрузку
    например четырехядерного процессора?
    Почемуто правильно отображает только когда
    выставляешь номер 4, тогда загрузка отображается также как в дисп.задач.
    проверено при архивировании и задании соответствия процессу (архиватору) определенного процессора.
    И как при запуске программы передать
    компоненту номер опрашиваемого процессора?

    Извините, если вопросы туповаты.
    Спасибо.

    ОтветитьУдалить
  7. По идее, процессоры нумеруются с 0, т.е. 0, 1, 2, 3. Для каждого процессора - своя загрузка. Если выставить 4, то должна выводиться общая загрузка. Я проверил - у меня сработало.

    Номер процессора из программы не передать, его можно задать только в файле проекта, потому что код компонента не содержит нужной функции. Но её можно добавить. Для этого выделите компонент и нажмите Ctrl+G.
    Перед строчкой "NumberCPU=Номер опрашиваемого процессора|1|1" добавьте @, чтобы получилось "@NumberCPU=Номер опрашиваемого процессора|1|1". Затем сохраните и закройте эту вкладку.

    Снова выделите компонент и нажмите Ctrl+F. Откроется код компонента. В разделе public добавьте новую вот так: procedure _work_doNumberCPU(var _Data:TData; Index:word);

    Затем сразу после слова implementation (оно чуть ниже) с новой строки вставьте код:
    procedure THICPUUsage._work_doNumberCPU;
    begin
    _prop_NumberCPU := ToInteger(_Data);
    end;

    Сохраните и перезапустите HiAsm. Теперь из параметра компонента можно сделать точку.

    ОтветитьУдалить
  8. Все прекрасно работает.
    Огромное спасибо!

    ОтветитьУдалить
  9. Использую сторонний компонент ProcMemory (http://www.hiasm.com/xf/topic.php?t=8207) Столкнулся тут с непонятной проблемой. Делаю трейнер для игры. Есть одно значение, оно идет как Float = 26 в виде 4Bytes = 1104150528 судя по Cheat Engine.
    Я пытаюсь заменить значение 26 на 1000. То есть 1000 = 1148846080. Пробую заменять значение - не меняется. Не пойму почему. С другими не Float значениями нормально.

    ОтветитьУдалить