Виджет для переносного ПК: мониторинг состояния аппаратного обеспечения

Мониторинг аппаратного обеспечения для оценки состояния компьютера. Реализация приложения "Мониторинг аппаратного обеспечения" на языке C# в среде программирования Visual Studio 2013 с использованием технологии Windows Presentation Foundation (WPF).

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 21.02.2016
Размер файла 767,8 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Министерство образования Республики Беларусь

Учреждение образования Белорусский государственный университет информатики и радиоэлектроники

Минск 2015

Факультет компьютерных систем и сетей

Кафедра информатики

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

к курсовому проекту

на тему: "Виджет для переносного ПК: мониторинг состояния аппаратного обеспечения"

Дисциплина: Архитектура вычислительных систем (АВС)

Выполнила: студентка группы 353501,

Новикова С.А.

Руководитель: ассистент кафедры информатики,

Плехова Т.В.

Оглавление

  • Введение
  • 1. Анализ предметной области
  • 1.1 Аппаратное обеспечение
  • 1.1 Процессы и потоки
  • 1.2 Обзор аналогов
  • 1.3 Постановка задачи
  • 2. Используемые технологии
  • 2.1 C#
  • 2.2 WPF и MUI
  • 2.3 Visual Studio 2013
  • 3. Программная реализация
  • 3.1 Возможности платформы.net
  • 3.2 Windows Management Instrumentation
  • 3.3 Open Hardware Monitor
  • 3.4 Процесс планирования и разработки
  • 4. Описание применения
  • 4.1 Окно мониторинга ЦПУ
  • 4.2 Окно мониторинга ОЗУ
  • 4.3 Окно мониторинга жестких дисков
  • 4.4 Окно мониторинга батареи
  • 4.5 Окно активных процессов
  • 4.6 Окно настроек
  • Заключение
  • Список использованных источников
  • Приложения

Введение

Операционная система (ОС) представляет собой комплекс взаимосвязанных программ, являющихся интерфейсом между приложениями пользователя и аппаратурой компьютера.

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

В целом, основной задачей мониторинга является оценка состояния компьютера. Это достигается путем непрерывной работы системы регистрации и сбора небольшого количества ключевых параметров описания объекта. Под объектом в данном случае понимается некоторый элемент аппаратного обеспечения.

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

Таким образом, определена цель моего курсового проекта: создание программного обеспечения по сбору информации о различных аппаратных компонентах компьютера.

1. Анализ предметной области

1.1 Аппаратное обеспечение

Аппаратное обеспечение вычислительных систем - обобщённое название оборудования, на котором работают компьютеры и сети компьютеров.

К аппаратному обеспечению обычно относят:

· центральный процессор (процессоры)

· оперативную память

· системную логику

· периферийные устройства

· сетевое оборудование

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

1.1 Процессы и потоки

При запуске программы операционная система создает среду выполнения задачи, включающую возможности доступа к различным системным ресурсам (память, устройства ввода-вывода, файлы и т.д.). Такая среда выполнения, также называемая окружением, именуется процессом. Совсем просто говоря, процесс - это копия исполняемого приложения.

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

· Каждый процесс обладает собственной памятью. Потоки же, запущенные внутри него, разделяют память между собой;

· Процесс внутри ОС обладает собственным идентификатором. Потоки существуют внутри процесса и обладают идентификатором внутри работающего приложения.

· Каждый поток имеет собственный стек и собственный набор регистров;

При корректной реализации потоки имеют определенные преимущества над процессами. Им требуется:

· Меньше времени для создания нового потока, поскольку создаваемый поток использует адресное пространство текущего процесса;

· Меньше времени для его завершения;

· Меньше времени для переключения между двумя потоками в пределах одного процесса;

· Меньше коммуникационных расходов, так как потоки разделяют все ресурсы.

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

1.2 Обзор аналогов

В настоящее время существует огромное количество различных утилит, созданных с целью мониторинга аппаратного обеспечения. Самые известные из них:

· CoolMon v.2.0 Final. Позволяет наблюдать за количеством процессов, температурой и загруженностью процессора, скорости вращения вентиляторов.

· Open Hardware Monitor. Обеспечивает мониторинг процессора, жестких дисков, видеокарты, вентиляторов.

· PC Accelerator 2004. Предназначена для оптимищации и ускорения работы компьютера. Позволяет изменять настройки привода CD-ROM, рендеринга видеокарты, различных приложений.

Это лишь малая часть разработанных приложений. Каждое из них подходит только под определенные типы процессоров и метринских плат. Часто бывает, что при установке на компьютер утилиты не могут получить доступ к аппаратным данным в результате закрытых настроек администратора. К тому же большинство приложений являются узкоспециализированными. Существуют утилиты для тестирования клавиатуры, оптимизации видеокарт, измерения производительности жестких дисков и их дефрагментации, очистки операционной памяти и др.

1.3 Постановка задачи

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

В данной курсовой работе будет реализовано приложение по сбору информации об аппаратном обеспечении компьютера.

Задачами программного обеспечения являются:

· мониторинг состояния всех ядер центрального процессорного устройства: сбор данных о температуре, напряжении, загрузке и частоте;

· мониторинг состояния жестких дисков: оценка памяти, температуры;

· мониторинг состояния оперативной памяти;

· мониторинг состояния аккумулятора: статус, напряжение;

· отслеживание активных процессов и их модулей.

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

2. Используемые технологии

Приложение "Мониторинг аппаратного обеспечения" реализовано на языке C# в среде программирования Visual Studio 2013 с использованием технологии Windows Presentation Foundation (WPF).

2.1 C#

98% преимуществ C# относятся к преимуществам.net, а не к преимуществам самого языка, к которым относятся сборщик мусора, нормальная поддержка исключений, обширная стандартная кодобаза, атрибуты и отражение, делегаты (хотя, на самом деле, можно было обойтись и без них) и события, промежуточный код, декларативные механизмы обеспечения безопасности выполнения кода, межъязыковое взаимодействие, свойства, индексы, достаточно полная и непротиворечивая система типов и т.д.

C# разрабатывался как язык программирования прикладного уровня для CLR, и, как таковой, зависит, прежде всего, от возможностей самой CLR. Это касается, прежде всего, системы типов C#, которая отражает BCL. Присутствие или отсутствие тех или иных выразительных особенностей языка диктуется тем, может ли конкретная языковая особенность быть транслирована в соответствующие конструкции CLR. Так, с развитием CLR от версии 1.1 к 2.0 значительно обогатился и сам C#; подобного взаимодействия следует ожидать и в дальнейшем. (Однако, эта закономерность была нарушена с выходом C# 3.0, представляющего собой расширения языка, не опирающиеся на расширения платформы.net.) CLR предоставляет C#, как и всем другим.net - ориентированным языкам, многие возможности, которых лишены "классические" языки программирования. Например, сборка мусора не реализована в самом C#, а производится CLR для программ, написанных на C# точно так же, как это делается для программ на VB.net, J# и др.

Среди достоинств самого C# можно выделить анонимные делегаты и лямбда-выражения, продолжения (continuations), встроенная в язык реализация некторых популярных примитивных паттернов проектирования (например, итераторов), большая степень выразительности, синтаксический сахар для типичных задач (в том числе linq), вывод типов из инициализации, нормальная поддержка модульности, частично определяемые типы и ещё много чего по мелочи. Приятно радует сведение к минимуму неявных преобразований типов и перегрузок унарных операторов.

Есть у C# и недостатки по отношению к C++, но в целом применение C# почти всегда гораздо дешевле при большем спектре решаемых с его помощью задач, нежели применение C++.

2.2 WPF и MUI

Windows Presentation Foundation (WPF) - это технология для построения клиентских приложений Windows, являющаяся частью платформы.net. WPF разработана как альтернатива технологии Windows Forms. Основные особенности технологии WPF:

1. Собственные методы построения и рендеринга элементов. В Windows Forms классы для элементов управления делегируют функции отображения системным библиотекам, таким как user32. dll. В WPF любой элемент управления полностью строится самой WPF.

2. Независимость от разрешения устройства вывода. Для указания размеров в WPF используется собственная единица измерения, равная 1/96 дюйма. Кроме этого, технология WPF ориентирована на использование не пиксельных, а векторных примитивов.

3. Декларативный пользовательский интерфейс. В WPF визуальное содержимое окна можно полностью описать на языке XAML. Это язык разметки, основанный на XML. Применение XAML является предпочтительным, но не обязательным - приложения WPF можно создавать, используя только код.

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

5. Анимация. В WPF анимация - неотъемлемая часть программного каркаса. Анимация определяется декларативными дескрипторами, и WPF запускает её в действие автоматически.

6. Приложения на основе страниц. В WPF можно строить приложения с кнопками навигации, которые позволяют перемещаться по коллекции страниц. Кроме этого, специальный тип приложения WPF - XBAP - может быть запущен внутри браузера.

7. Стили и шаблоны. Стили стандартизируют форматирование и позволяют повторно использовать его по всему приложению. Шаблоны дают возможность изменить способ отображения любых элементов управления, даже таких основополагающих, как кнопки или поля ввода.

Для упрощения создания пользовательского интерфейса использовался шаблон MUI (Modern User Interface) for WPF. Он представляет собой набор элементов управления и стилей, применяемых к готовому WPF-приложению. MUI является проектом с открытым кодом и используется в Windows Phone и Windows Store. Особенность данного шаблона интерфейса - возможность изменения внешнего вида приложения в течение его работы.

2.3 Visual Studio 2013

Visual Studio включает в себя редактор исходного кода с поддержкой технологии IntelliSense и возможностью простейшего рефакторинга кода. Встроенный отладчик может работать как отладчик уровня исходного кода, так и как отладчик машинного уровня. Остальные встраиваемые инструменты включают в себя редактор форм для упрощения создания графического интерфейса приложения, веб-редактор, дизайнер классов и дизайнер схемы базы данных. Visual Studio позволяет создавать и подключать сторонние дополнения (плагины) для расширения функциональности практически на каждом уровне, включая добавление поддержки систем контроля версий исходного кода (как например, Subversion и Visual SourceSafe), добавление новых наборов инструментов (например, для редактирования и визуального проектирования кода на предметно-ориентированных языках программирования или инструментов для прочих аспектов процесса разработки программного обеспечения (например, клиент Team Explorer для работы с Team Foundation Server).

В Visual Studio 2013 добавлены новые возможности:

· Team Explorer;

· режим карты для просмотра кода;

· Система CodeLens;

· Облачная структура в Visual Studio Online;

3. Программная реализация

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

3.1 Возможности платформы.net

При реализации системы по сбору информации о процессах/потоках были использованы возможности платформы.net.

Статический класс Process из пространства имен System. Diagnostic предоставляет доступ к локальным и удаленным. В работе использовались методы GetProcesses (), GetProcessByName () для получения процесса. Экземплярное свойство ProseccName позволяет получить информацию о процессе, а так же получить доступ к модулям данного процесса. Свойство Modules возвращает коллекцию всех модулей, относящихся к данному процессу. Названия файлов - значения свойства ModuleName каждого модуля (Приложение А)

3.2 Windows Management Instrumentation

Windows Management Instrumentation (WMI) - это одна из базовых технологий для централизованного управления и слежения за работой различных частей компьютерной инфраструктуры под управлением платформы Windows.

Технология WMI - это расширенная и адаптированная под Windows реализация стандарта WBEM, принятого многими компаниями, в основе которого лежит идея создания универсального интерфейса мониторинга и управления различными системами и компонентами распределенной информационной среды предприятия с использованием объектно-ориентированных идеологий и протоколов HTML и XML.

В основе структуры данных в WBEM лежит Common Information Model (CIM), реализующая объектно-ориентированный подход к представлению компонентов системы. CIM является расширяемой моделью, что позволяет программам, системам и драйверам добавлять в неё свои классы, объекты, методы и свойства.

WMI, основанный на CIM, также является открытой унифицированной системой интерфейсов доступа к любым параметрам операционной системы, устройствам и приложениям, которые функционируют в ней.

Важной особенностью WMI является то, что хранящиеся в нём объекты соответствуют динамическим ресурсам, то есть параметры этих ресурсов постоянно меняются, поэтому параметры таких объектов не хранятся постоянно, а создаются по запросу потребителя данных. Хранилище свойств объектов WMI называется репозиторием и расположено в системной папке операционной системы Windows: %SystemRoot%\System32\WBEM\Repository.

Так как WMI построен по объектно-ориентированному принципу, то все данные операционной системы представлены в виде объектов и их свойств и методов.

Все классы группируются в пространства имен, которые иерархически упорядочены и логически связаны друг с другом по определенной технологии или области управления. В WMI имеется одно корневое пространство имен Root, которое в свою очередь имеет 4 подпространства: CIMv2, Default, Security и WMI.

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

мониторинг аппаратное обеспечение приложение

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

Для обращения к объектам WMI используется специфический язык запросов WMI Query Language (WQL), который является одной из разновидностей SQL.

В работе для получения информации о ресурсах системы использовались следующие WMI queries (Приложение Б):

· батарея

var query = new ManagementObjectSearcher ("SELECT * FROM Win32_Battery");

· жесткие диски

var query = new ManagementObjectSearcher ("SELECT * FROM Win32_DiskDrive");

3.3 Open Hardware Monitor

Разработчики утилиты Open Hardware Monitor представили открытую одноименную библиотеку, инструменты которой позволяют получать данные об аппаратной составляющей компьютера. Данные получаются использованием WMI-запросов, однако процесс их извлечения заметно упрощен.

Основными типами данных являются:

· HardwareType - перечисление, предназначенное для различения частей оборудования друг от друга. Эта структура не полагается на конкретный тип, так как получение данных зависит от датчиков, фиксирующих параметры, а таковые могут отсутствовать. В проекте использованы некоторые значения перечисления: CPU, RAM и HDD.

· SensorType - перечисления для различения датчиков определенных типов параметров. Использованы Voltage, Clock, Temperature, Load, Data, Level.

Технология запросов Open Hardware Monitor основана на взаимосвязи экземпляров датчиков и аппарата: аппаратная компонента имеет несколько датчиков, каждый датчик имеет один родительский аппарат.

Свойство Hardware возвращает коллекцию доступных аппаратных элементов. Свойства Name, HardwareType позволяют получить и разграничить получаемые параметры. Свойство Sensors возвращает коллекцию параметров датчиков. Информация о каждом показателе получается при помощи свойств Name и Value. (Приложение В)

Таким образом, процесс извлечения данных об аппаратном состоянии представляет собой следующий алгоритм:

· В качестве родительского программного компонента выступает Hardware.computer, который настраивается в зависимости от необходимых данных с помощью свойств: RAMEnabled, HDDEnabled, CPUEnabled.

· Свойство Computer. Hardware возвращает все доступные аппаратные компоненты, которые фильтруются по типу с помощью свойства HardwareType.

· У каждого элемента Computer. Hardware вызывается свойство Sensors. Полученная коллекция типов датчиков фильтруется по типу регистрируемых данных. Значения данных передаются в результирующие списки.

3.4 Процесс планирования и разработки

Изначально предполагалось, что все необходимые данные будут запрашиваться с использованием "чистых" WMI-запросов. Как оказалось в процессе реализации, эта технология не может предоставить все запрашиваемые параметры. Библиотека не имеет доступа к таким данным, как температура процессора, его загрузка, напряжение на нем, список всех активных процессов, температуры жестких дисков.

Таким образом, появилась необходимость в новой библиотеке, которая бы решила данную проблему. Такой технологией оказался Open Hardware Monitor, который смог предоставить все данные, кроме информации о процессах и их модулях. Информация о них поставляется с помощью стандартного класса System. Diagnostics. Process.

В основном, вся работа проекта основана на библиотеке Open Hardware Monitor, которая позволяет получать текущие аппаратные данные. Однако для того чтобы получить всю информацию о каком-либо компоненте, необходим был довольно большой промежуток времени, так как система должна была получить все параметры датчиков, распределить их по типам и обработать. Для оптимизации данного процесса была применена многопоточность. Для регистрации данных о каждом аппаратном компоненте были созданы потоки, каждый из которых отвечал за сбор информации с отдельного датчика. Таким образом, было увеличено быстродействие и появилась возможность обновлять данные ежесекундно.

4. Описание применения

Приложение содержит ряд окон для предоставления возможности предоставления информации о системе. Рассмотрим работу с каждым из них.

4.1 Окно мониторинга ЦПУ

Рис. 1. Окно мониторинга ЦПУ

При запуске программы пользователю предоставляется окно с наиболее важными аппаратными характеристиками - данными о ЦПУ (рис.1). На нем имеется несколько окон со списками параметров. Каждое окно отвечает за характеристики, регистрируемые отдельными датчиками: мощность, температура, частота и загрузка ЦПУ. Показатели измеряются ежесекундно.

4.2 Окно мониторинга ОЗУ

Рис. 2. Окно мониторинга ОЗУ

В окне представлены данные о количестве занятой и свободной памяти, а также о текущей загрузке ОЗУ (рис. 2). Показатели обновляются каждые две секунды.

4.3 Окно мониторинга жестких дисков

Рис. 3. Окно мониторинга жестких дисков

В окне представлены данные о жестких дисках: их объем, температура, загрузка и т.д. (рис. 3). Показатели обновляются по клику на кнопку "Update the data”.

4.4 Окно мониторинга батареи

Рис. 4. Окно мониторинга батареи

В окне представлены текущие данные о батарее: статус, доступность, напряжение, зарядка, оставшееся время до полной разрядки (рис.4). Данные обновляются каждые пять секунд.

4.5 Окно активных процессов

Рис. 5. Окно с информацией об активных процессах и модулях

В окне представлены названия всех активных процессах (рис.5). При клике по одному из процессов, во втором окне появляются названия всех файлов-модулей. В том случае, если доступ к процессу запрещен, высветится уведомление.

4.6 Окно настроек

Рис. 6. Окно с настройками интерфейса

Окно предоставляется шаблоном MUI. (рис.6) Пользователю предоставляется возможность выбрать тему и акцентный цвет в ходе использования приложения.

Заключение

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

В результате написания проекты были закреплены навыки работы с технологией WPF, многопоточностью. Также были применены WMI-запросы и шаблон интерфейса MUI, технология Open Hardware Monitor.

Программное средство "Hardware Monitoring” - это проектный программный продукт, готовый к использованию на персональных компьютерах различных типов.

В качестве улучшений видятся: управление процессами, сбор информации о дополнительных компонентах (видеокарта, BIOS и т.д.), общее расширение интерфейса и функциональности.

Список использованных источников

[1] Волосевич, А. Технология Windows Presentation Foundation / А. Волосевич. - Минск.: БГУИР, 2014. - 108 с.

[2] Microsoft [Электронный ресурс]. - Электронные данные. - Режим доступа: https: // msdn. microsoft.com/.

[4] GitHub [Интернет ресурс]. - Электронные данные. - Режим доступа: https: // github.com/firstfloorsoftware/mui/wiki

[4] Википедия [Интернет ресурс]. - Электронные данные. - Режим доступа: http://ru. wikipedia.org/wiki/.

[5] Open Hardware Monitor [Электронный ресурс]. - Электронные данные. - Режим доступа: http://openhardwaremonitor.org/

Приложения

Приложение А Класс получения информации о процессах (использование возможностей платформы.net)

public class Processes

{

public List<string> ProcessNames { get; set; }

public ProcessModuleCollection modules {get; set; }

public Process [] processes { get; set; }

public Processes ()

{

ProcessNames = new List<string> ();

}

public void GetAllProcesslNames ()

{

processes = Process. GetProcesses ();

for (int i = 0; i < processes. Length; i++)

{

ProcessNames. Add (processes [i]. ProcessName);

}

}

public static List<string> GetModules (string process_name)

{

List<string> result = new List<string> ();

try

{

Process [] choosed_process = Process. GetProcessesByName (process_name);

ProcessModuleCollection modules = choosed_process [0]. Modules;

for (int i = 0; i < modules. Count; i++)

{

result. Add (modules [i]. ModuleName);

}

}

catch (System.componentModel. Win32Exception e)

{

result. Clear ();

}

return result;

}

}

Приложение Б Класс получения информации о батарее (использование WMI)

class Battery

{

private string ComputerName { get; set; }

public List<string> ResultInfo { get; set; }

public Battery ()

{

ComputerName = SystemInformation.computerName;

ResultInfo = new List<string> ();

}

public void GetBatteryInformation ()

{

string serverName = @"\\" + ComputerName + @"\root\cimv2";

ManagementScope scope = new ManagementScope (serverName);

SelectQuery query = new SelectQuery ("SELECT * FROM Win32_Battery");

try

{

using (var searcher = new ManagementObjectSearcher (scope, query))

{

ManagementObjectCollection info = searcher. Get ();

var batteryAvailabilities = (from ManagementObject value in info select value ["Availability"]. ToString ()). ToList ();

foreach (var value in batteryAvailabilities)

{

int status = Int32. Parse (value);

string status_value = CheckBatteryAvailability (status);

ResultInfo. Add (String. Format ("Availability: {0}",status_value));

}

var batteryStatuses = (from ManagementObject value in info select value ["BatteryStatus"]. ToString ()). ToList ();

foreach (var value in batteryStatuses)

{

int status = Int32. Parse (value);

string status_value = CheckBatteryStatus (status);

ResultInfo. Add (String. Format ("Status: {0}",status_value));

}

var batteryVolts = (from ManagementObject value in info select value ["DesignVoltage"]. ToString ()). ToList ();

foreach (var value in batteryVolts)

{

int millivolt;

Int32. TryParse (value, out millivolt);

double volt = (double) millivolt / 1000;

ResultInfo. Add (String. Format ("Voltage: {0} V",volt));

}

var batteryCharges = (from ManagementObject value in info select value ["EstimatedChargeRemaining"]. ToString ()). ToList ();

foreach (var value in batteryCharges)

{

ResultInfo. Add (String. Format ("Charged on: {0} % ",value));

}

var batteryInfo = (from ManagementObject value in info select value ["EstimatedRunTime"]. ToString ()). ToList ();

foreach (var value in batteryInfo)

{

ResultInfo. Add (String. Format ("Remaining time: {0} min",value));

}

}

}

catch (ManagementException e)

{

return;

}

}

private string CheckBatteryAvailability (int status)

{

switch (status)

{

case 1:

return "Other";

case 2:

return "Unknown";

case 3:

return "Running or Full Power";

case 4:

return "Warning";

case 5:

return "In Test";

case 6:

return "Not Applicable";

case 7:

return "Power Off";

case 8:

return "Off Line";

case 9:

return "Off Duty";

case 10:

return "Degraded";

case 11:

return "Not Installed";

case 12:

return "Install Error";

case 13:

return "The device is known to be in a power save mode, but its exact status is unknown";

case 14:

return "The device is in a power save state but still functioning, and may exhibit degraded performance";

case 15:

return "The device is not functioning, but could be brought to full power quickly. ";

case 16:

return "Power Cycle";

case 17:

return "The device is in a warning state, though also in a power save mode. ";

default:

return "";

}

}

private string CheckBatteryStatus (int status)

{

switch (status)

{

case 1:

return "The battery is discharging";

case 2:

return "The system has access to AC";

case 3:

return "Fully Charged";

case 4:

return "Low";

case 5:

return "Critical";

case 6:

return "Charging";

case 7:

return "Charging and High";

case 8:

return "Charging and Low";

case 9:

return "Charging and Critical";

case 10:

return "Undefined";

case 11:

return "Partially Charged";

default:

return "";

}

}

}

Приложение B Класс получения показателей характеристик процессора (использование возможностей библиотеки OpenHardwareMonitor)

public static class CPU

{

public static Computer GetComputer ()

{

Computer myComputer;

MySettings settings = new MySettings (new Dictionary<string, string>

{

{"/intelcpu/0/temperature/0/values", "H4sIAAAAAAAEAOy9B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Iu6 // MH37x79i9/+NX6N3/TJm9/5f/01fw1+fosnv+A/+OlfS37/jZ/s/Lpv9fff6Ml/NTef/yZPnozc5679b+i193 // TQZ+/w2Dd+P9/sZeX/67v/GTf/b3iP3u4/ObBL // 73+i+f039+D8Zk/+xz/e/P6beu2TQZju8yH8f6OgzcvPv/U3/Rb8+z/0f/9b/+yfaOn8079X6fr6Cws7ln/iHzNwflPv99/wyS/+xY4+v/evcJ+733+jJ5 // Cw7/4ndy9Im3+U2e/Fbnrk31C93vrt/fyPvdb+N // hsF7/4/AQAA // 9NLZZ8WAIAAA==" },

{"/intelcpu/0/load/0/values", "H4sIAAAAAAAEAOy9B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Iu6 // MH37x79i9++mpwcv/md/9df89egZ/xX/ym/5y/4D37618Lv7ya // u+58+u+5d9/z7/5t/w9/6u5fP5bH/6av+eTkXyefXxp26ONaf/v/dG/sf39D/rvnv4e5vc/0IP56/waK/vuHzf5I38P8/tv+mv8Rbb9f0pwTF9/zr/1X9vP/8I // +/6Pf7Z30N+/zdf/HX29zd/859q4aCNP5b // U+U3/+7f+zXOjZwfqvDX/V7/o9/vPz+a1G/pv0f+fGlhfk7eZ // N3/0v28 // 5X0u/n8Cxq7+f1X/tHft20A5x8a/W5/02+BP36Nf+j/nv8XfzrT+c2 // Ob4p3+vktvUhNs/+xcWikP6e/4T/5jS5M8/sL8vP/5ff49f/Ivl9 // sHzv6PX/vXyG // 9R/94/9HuZ34P/5vyC // 3W/5e/1exa/k+Bw4bUBnU2bP4Xg/1bn0uafeTH6PatfKL // N3/0t2y/gG9+/8+IzqYNxmU+/+jwX7afY67/nwAAAP // GYSA31gCAAA=" },

});

myComputer = new Computer (settings) { CPUEnabled = true };

try

{

myComputer. Open ();

}

catch (NullReferenceException e)

{

myComputer. Open ();

}

return myComputer;

}

public static string GetCPUName ()

{

Computer myComputer = GetComputer ();

foreach (var hardwareItem in myComputer. Hardware)

{

if (hardwareItem. HardwareType == HardwareType. CPU)

{

hardwareItem. Update ();

foreach (IHardware subHardware in hardwareItem. SubHardware)

subHardware. Update ();

string name = hardwareItem. Name;

return name;

}

}

return "";

}

public static void GetCPUInfo (int id, int [] threadId, out List<string> info)

{

Computer myComputer = GetComputer ();

Thread. Sleep (0);

info = new List<string> ();

foreach (var hardwareItem in myComputer. Hardware)

{

if (hardwareItem. HardwareType == HardwareType. CPU)

{

hardwareItem. Update ();

foreach (IHardware subHardware in hardwareItem. SubHardware)

subHardware. Update ();

// name = hardwareItem. Name;

foreach (var sensor in hardwareItem. Sensors)

{

if (id == threadId [1] && sensor. SensorType == SensorType. Temperature)

{

info. Add (String. Format ("{0}: {1} C", sensor. Name, sensor. Value. HasValue? sensor. Value. Value. ToString (): "no value"));

}

if (id == threadId [2] && sensor. SensorType == SensorType. Clock)

{

info. Add (String. Format ("{0}: {1} MHz", sensor. Name, sensor. Value. HasValue? sensor. Value. Value. ToString (): "no value"));

}

if (id == threadId [3] && sensor. SensorType == SensorType. Load)

{

info. Add (String. Format ("{0}: {1} %", sensor. Name, sensor. Value. HasValue? sensor. Value. Value. ToString (): "no value"));

}

if (id == threadId [0] && sensor. SensorType == SensorType. Power)

{

info. Add (String. Format ("{0}: {1} W", sensor. Name, sensor. Value. HasValue? sensor. Value. Value. ToString (): "no value"));

}

}

}

Thread. Sleep (500);

}

return;

}

}

Приложение Г Класс мониторинга ЦПУ

public partial class CPUInfo: UserControl

{

int [] threadId { get; set; }

public static bool visible { get; set; }

public CPUInfo ()

{

threadId = new int [4];

visible = true;

InitializeComponent ();

SetAllLabels ();

StyleAllListViews ();

StartThreads ();

}

private void SetLabel (Label label, string content)

{

label. Content = content;

label. FontSize = 20.0;

label. FontWeight = FontWeights. Bold;

}

private void SetAllLabels ()

{

SetLabel (cpu_name_label, CPU. GetCPUName ());

SetLabel (cpu_power_label, "CPU power");

SetLabel (cpu_temp_label, "CPU temp");

SetLabel (cpu_clock_label, "CPU clock");

SetLabel (cpu_load_label, "CPU load");

}

private void SetListViews (int id, List<string> info)

{

if (id == threadId [0])

AddNewItemsToListView (cpu_power_lv, info);

if (id == threadId [2])

AddNewItemsToListView (cpu_clock_lv, info);

if (id == threadId [1])

AddNewItemsToListView (cpu_temp_lv, info);

if (id == threadId [3])

AddNewItemsToListView (cpu_load_lv, info);

}

private void StyleListView (ListView lv)

{

lv. Margin = new Thickness (5.0);

SolidColorBrush brush = new SolidColorBrush (Color. FromRgb (204, 204, 204));

lv. Background = brush;

}

private void StyleAllListViews ()

{

StyleListView (cpu_power_lv);

StyleListView (cpu_clock_lv);

StyleListView (cpu_temp_lv);

StyleListView (cpu_load_lv);

}

private void AddNewItemsToListView (ListView lv, List<string> items)

{

lv. Dispatcher. BeginInvoke (new Action (delegate ()

{

lv. Items. Clear ();

SolidColorBrush brush = new SolidColorBrush (Color. FromRgb (51, 51, 51));

foreach (var item in items)

{

ListViewItem new_item = new ListViewItem ();

new_item. Content = item;

lv. Items. Add (new_item);

new_item. Foreground = brush;

}

lv. Items. Refresh ();

}));

}

public void StartThreads ()

{

Thread temperatureThread = new Thread (new ThreadStart (ThreadRoutine));

threadId [0] = temperatureThread. ManagedThreadId;

temperatureThread. Start ();

Thread clockThread = new Thread (new ThreadStart (ThreadRoutine));

threadId [1] = clockThread. ManagedThreadId;

clockThread. Start ();

Thread loadThread = new Thread (new ThreadStart (ThreadRoutine));

threadId [2] = loadThread. ManagedThreadId;

loadThread. Start ();

Thread powerThread = new Thread (new ThreadStart (ThreadRoutine));

threadId [3] = powerThread. ManagedThreadId;

powerThread. Start ();

}

public void ThreadRoutine ()

{

while (! StopThread. StopAllThreads)

{

int id = Thread. CurrentThread. ManagedThreadId;

List<string> info;

CPU. GetCPUInfo (id, threadId, out info);

SetListViews (id, info);

visible = this. IsVisible;

StopThread. StopCpuThread =! visible;

} }

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.